所以我有一些像这样结构化的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
,但我还没有测试过。有谁介意帮我搞清楚我做错了什么?
答案 0 :(得分:2)
使用super(EnemyBullet, self).__init__()
(和ShipBullet
类似)。 super
使用第一个参数中的类来确定MRO中的下一个基数。