AttributeError : Instance de la Classe n'a pas d' __appel__ méthode
Je suis un peu nouveau pour python, mais familier avec la programmation orientée objet. Je suis en train d'écrire un jeu avec PyGame. Fondamentalement, mon but est de rendre les arbres de toutes les quelques secondes et déplacer l'arbre rectangles à travers l'écran.
Donc voici mon code:
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()
Mais quand j'execute ce les premiers arbres sont générés avec succès, mais alors la fenêtre PyGame fermé et j'ai cette erreur:
Traceback (most recent call last):
File "error.py", line 25, in <module>
trees.append(tree())
AttributeError: tree instance has no __call__ method
Vous devez vous connecter pour publier un commentaire.
Je suppose que c'est parce que vous avez un nom de variable
tree
(utilisé danstree.render()
) qui est en conflit avec votre nom de la classe. L'appelantTree
serait mieux (et plus pythonic ^^).Vous voudrez peut-être appeler la
tree
variable dans lefor
boucle d'autre chose que detree
. C'est l'occultation du nom de la classe.votre contexte de la pollution des
le compilateur peut pense que vous n'êtes pas d'init de la classe, mais les appels de ses appel fonction.
__call__
méthode), et de l'instanciation est en fait effectuée par l'appel de la classe qui implémente l'opérateur d'appel. OIE, tout le compilateur voit, c'est un "appel" de l'opération, quel qu'il soit effectué sur (et même le fait que l'objet de l'appelé ou ne pas appliquer l'opérateur d'appel) déterminé au moment de l'exécution.