所以我有一些类似这样的python代码;

class GameObject(pygame.spriteDirtySprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = None
        self.rect  = None
        self.state = None

class Bullet(gameobject.GameObject):
    FRAME  = pygame.Rect(23, 5, 5, 5)
    STATES = config.Enum('IDLE', 'FIRED', 'MOVING', 'COLLIDE', 'RESET')

    def __init__(self):
        gameobject.GameObject.__init__(self)
        self.image = config.SPRITES.subsurface(self.__class__.FRAME)
        self.rect  = self.__class__.START_POS.copy()
        self.state = self.__class__.STATES.IDLE

class ShipBullet(bullet.Bullet):
    START_POS = pygame.Rect(somewhere)

    def __init__(self):
        super(bullet.Bullet, self).__init__()
        self.add(ingame.PLAYER)

class EnemyBullet(bullet.Bullet):
    START_POS = pygame.Rect(somewhere else)

    def __init__(self):
        super(bullet.Bullet, self).__init__()
        self.add(ingame.ENEMIES)

它们实际上在不同的文件中,但这是一个继承问题,而不是依赖问题。
注意,ShipBulletEnemyBullet有不同的START_POS静态成员,但Bullet不存在。因为Bullet永远不会真正被创建(如果是C++,我会把它抽象成一个类),那是有意的。我的推理是,当我从它的子类调用Bullet.__init__()时,然而,所述子类在初始化其成员时将引用它们自己的START_POS但事实并非如此;ShipBullet.rect(与EnemyBullet类似)是None。我相信image也可能None,但我还没有测试过有谁介意帮我弄清楚我做错了什么吗?

最佳答案

使用super(EnemyBullet, self).__init__()(类似于ShipBullet)。super使用第一个参数中的类来确定mro中的下一个基。

08-16 04:53