【问题标题】:Python: Initializing an object's members with a parent's constructor?Python:使用父构造函数初始化对象的成员?
【发布时间】:2012-11-10 09:09:06
【问题描述】:

所以我有一些结构类似这样的 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,但我还没有对此进行测试。有人介意帮我弄清楚我做错了什么吗?

【问题讨论】:

    标签: python oop inheritance static static-members


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多