所以我有一些结构类似于这样的 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
,但我还没有对此进行测试。有人介意帮我弄清楚我做错了什么吗?
最佳答案
使用 super(EnemyBullet, self).__init__()
(和 ShipBullet
类似)。 super
使用第一个参数中的类来确定 MRO 中的下一个碱基。
关于Python:使用父类的构造函数初始化对象的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504733/