我使用构造函数__init__错了吗?

时间:2015-01-26 12:39:02

标签: class python-3.x constructor initialization pygame

我有一个类试图创建一个实例,然后将其定义为精灵,但也允许这个实例有其他变量(这是我在atari突破游戏上的进展跟进,我问另一个问题here。)

  

只是一个旁注(可能没有解释得很好,抱歉):我原本把所有的属性都附在一块砖头上。属性:

     

self.brick = pygame.sprite.Sprite() # the .brick is now a sprite

     

因为我认为不可能给精灵用户发明属性,例如 self.brick.hardness 所以我这样做了:

     

self.hardness = 1 # the object has another attribute not interfering with the sprite

     

这与我的sprite碰撞引擎产生了一些冲突(长话短说; .brick 属性无法调用方法 blockType 因为它不是那个类的实例),所以我只是决定让实际的实例成为一个精灵,这可能会导致与其不可告人的属性发生冲突。

精灵是通过__init_构造函数创建的,其他属性仅在调用适当的方法时添加。

class Block:        
    def __init__ (self):
        self = pygame.sprite.Sprite()
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([width, height])
        self.rect = self.image.get_rect()
    def blockType (self, hardness):
        self.hardness = hardness
        if self.hardness == 1:
            self.image.fill (RED)

block = Block () # These parenthesis might be wrong here
block.blockType (1)

现在这个问题可能再次归因于继承,但是当我创建实例时,一切都很好。但是,当我尝试调用该方法时,我收到错误:

AttributeError: 'Block' object has no attribute 'image'

我认为这很奇怪,因为在通过运行构造函数方法创建对象之后应该拥有一个图像属性(如果我不调用该方法,我实际上完全有能力在屏幕上绘制这些精灵,所以他们在技术上存在)。我试图绕过这条路,但在这一点上,我完全不知道出了什么问题。

如果您需要更多信息,请告知我们,我会更新。

1 个答案:

答案 0 :(得分:4)

使用此代码时

class Block:        
    def __init__ (self):
        self = pygame.sprite.Sprite() # don't overwrite self here
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([width, height])
        self.rect = self.image.get_rect()

使用新self实例覆盖Block(这是对新创建的Sprite实例的引用);并且该实例迟早会被删除,因为你没有保留它的引用。

我猜你的意图是继承Sprite(这在使用pygame时很常见),所以你必须使用:

class Block(Sprite):        
    def __init__ (self):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.rect = self.image.get_rect()

现在BlockSprite的子类,并且具有imagerect属性。