Python:使用父类的构造函数初始化对象的成员?

标签 python oop inheritance static static-members

所以我有一些结构类似于这样的 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 中的下一个碱基。

关于Python:使用父类的构造函数初始化对象的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504733/

相关文章:

java - OOP - 谁可以访问公共(public)、私有(private)、 protected 变量?

java - 如何将常量传递给方法?

c++ - 检测 CRTP 基类的 sibling

python - 如何使用 beautifulsoup 提取段落标签中的完整文本

list - 通过反转另一个列表来扩展一个列表的最Pythonic方法是什么?

python - 用 Pandas 计算矩阵的逆

c++ - 我的聚合、关联和组合关系在这个 C++ 程序中不起作用?

python - 值错误: Found input variables with inconsistent numbers of samples: [4, 103]

c++ - 设计模式 : Should I use inheritance here?

javascript - 将继承与模块模式相结合