4

したがって、次のような構造の 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)

これらは実際には別のファイルにありますが、これは継承の問題であり、依存関係の問題ではありません。

ShipBulletと にEnemyBulletは異なるSTART_POS静的メンバーがありますが、そうでBulletはないことに注意してください。Bullet実際には作成されないため (これが C++ の場合は抽象クラスにします)、これは意図的なものです。Bullet.__init__()ただし、そのサブクラスから呼び出すと、サブクラスはSTART_POSメンバーを初期化する際に自分自身を参照するというのが私の理由です。ただし、そうではありません。ShipBullet.rect(同様にEnemyBullet)がございNoneます。私もimageそうかもしれないと信じNoneていますが、まだテストしていません。私が間違っていることを理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

2

を使用しますsuper(EnemyBullet, self).__init__()(および についても同様ShipBullet)。super最初の引数のクラスを使用して、MRO 内の次のベースを決定します。

于 2012-11-22T01:57:03.293 に答える