属性错误:类实例没有__call__方法。

10

我对Python还不太熟悉,但是熟悉面向对象编程。我正在尝试使用PyGame编写一个游戏。基本上,我的目标是每隔几秒钟渲染树并将树的矩形在屏幕上移动。

这是我的代码:

from collections import deque
import pygame,random,sys

pygame.init()
size = 800,600
screen = pygame.display.set_mode(size)

class tree:
    def __init__(self):
            self.img = pygame.image.load("tree.png")
            self.rect = self.img.get_rect()
    def render(self):
            screen.blit(self.img,self.rect)
    def move(self,x,y):
            self.rect = self.rect.move(x,y)

#creating a queue of trees
trees = deque()

#appending the first tree on to the queue 
trees.append(tree())


while 1:


    for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()

    #appending tree() to trees queue every 300 ms
    if pygame.time.get_ticks() % 300 == 0:
            trees.append(tree())

    #rendering and moving all the tree rects of trees in the queue
    for tree in trees:
            tree.render()
            tree.move(20,2)
    pygame.display.flip()

但是当我执行这个程序时,最初的几棵树会成功生成,然后PyGame窗口关闭并出现以下错误:

Traceback (most recent call last):
File "error.py", line 25, in <module>
trees.append(tree())
AttributeError: tree instance has no __call__ method
3个回答

22

我猜原因是你的变量名tree(在tree.render()中使用)与你的类名冲突了。最好将其命名为Tree(更符合Python风格^^)。


4

for 循环中,您可能希望将 tree 变量命名为其他名称。它会掩盖类名。


1

您的上下文被污染了

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    #appending tree() to trees queue every 300 ms
    if pygame.time.get_ticks() % 300 == 0:
        trees.append(tree()) <----------------------- second time, this tree is not your class, but the last instance of tree

    #rendering and moving all the tree rects of trees in the queue
    for tree in trees: <-------------------- here, the last tree will get name with tree
        tree.render()
        tree.move(20,2) 
    pygame.display.flip()

编译器可能会认为您没有初始化该类,但调用了其call函数。


2
在Python中,您可以创建可调用类型(通过__call__方法实现“调用”运算符的类型),并且实例化实际上是通过调用类来执行的,该类确实实现了调用运算符。换句话说,编译器看到的只是一个“调用”操作,在运行时确定它是在哪个对象上执行的(甚至被调用的对象是否实现了调用运算符)。 - bruno desthuilliers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接