AttributeError : 类实例没有 __call__ 方法

Posted

技术标签:

【中文标题】AttributeError : 类实例没有 __call__ 方法【英文标题】:AttributeError : Class Instance has no __call__ method 【发布时间】:2012-07-04 16:36:52 【问题描述】:

我对python有点陌生,但熟悉OOP。我正在尝试使用 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

【问题讨论】:

【参考方案1】:

我猜这是因为你有一个变量名tree(用于tree.render())与你的类名冲突。称它为Tree 会更好(而且更pythonic ^^)。

【讨论】:

【参考方案2】:

您可能希望在for 循环中调用tree 变量而不是tree。它隐藏了类名。

【讨论】:

【参考方案3】:

你的上下文被污染了

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函数。

【讨论】:

在 Python 中,您可以创建可调用类型(通过__call__ 方法实现“调用”运算符的类型),实例化实际上是通过调用实现调用运算符的类来执行的。 IOW,编译器看到的只是一个“调用”操作,无论它执行什么(甚至被调用的对象是否实现调用运算符)都是在运行时确定的。

以上是关于AttributeError : 类实例没有 __call__ 方法的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:模块“__main__”没有属性“AverageWordLengthExtractor”

AttributeError:“NoneType”对象没有属性“visible_fields”

AttributeError:“NumpyArrayIterator”对象没有属性“类”

python笔记61 - __getattr__ 属性查找学习与使用

AttributeError:模块''没有属性'__path__'

装饰方法:AttributeError:'function'对象没有属性'__self__'?