2012-07-04 15 views
5

Python için biraz yeni, ancak OOP'u tanıyorum. PyGame kullanarak bir oyun yazmaya çalışıyorum. Temel olarak, amacım ağaçların birkaç saniyede işlenmesi ve ağaçların etkilerini ekran boyunca hareket ettirmektir. Yani buradaAttributeError: Sınıf örneğinin __call__ yöntemi yok

benim kodudur:

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() 

Ama bu yürüttüğünüzde ilk birkaç ağaçlar başarıyla oluşturulur ama sonra pygame pencere kapalı ve bu hatayı alıyorum:

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

cevap

19

Bunun nedeni, sınıf adınızla çakışan tree (tree.render() modelinde kullanılan) değişken adınızın olmasıdır. Tree numaralı telefondan daha iyi (ve daha pythonic ^^) daha iyi olurdu.

+0

Bunu farketmemek beni aptal, teşekkürler! :) –

+1

Rica ederim! – Emmanuel

4

Sen tree değişkenini for döngüsünde tree dışında bir şey aramak isteyebilir. Ders adını gölgeliyor.

+0

Haha, çok aptalım. Teşekkürler! –

1

, içerik

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() 

kirlenmiş olan may Sınıfa init değildir düşünür ama onun çağrı işlevi çağırır derleyici.

+1

Python'da, çağrılabilir türler oluşturabilirsiniz ('__call__' yöntemiyle' çağrı 'operatörünü uygulayan türler) ve gerçekleme, çağrı operatörünü uygulayan sınıfı çağırarak gerçekleştirilir. IOW, derleyicinin gördüğü her ne olursa olsun (çağrı yapılan nesnenin çağrı operatörünü uyguladığı veya uygulamadığı gerçeği) çalışma zamanında belirlenir. –

İlgili konular