所以我正在制作一个游戏,所有对象都派生自一个 GameObject 类,看起来像这样;
class GameObject(pygame.sprite.DirtySprite):
actions = dict()
def __init__(self):
pygame.sprite.DirtySprite.__init__(self)
self.rect = None
self.state = None
def update(self):
if callable(self.__class__.actions[self.state]):
#If this key has a function for its element...
self.__class__.actions[self.state](self)
现在,我遇到了另一个继承问题。观察下面的类,以及派生自它的两个类;
class Bullet(gameobject.GameObject):
FRAME = pygame.Rect(23, 5, 5, 5)
STATES = config.Enum('IDLE', 'FIRED', 'MOVING', '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
actions = {
STATES.IDLE : None ,
STATES.FIRED : start_moving,
STATES.MOVING : move ,
STATES.RESET : reset ,
}
class ShipBullet(bullet.Bullet):
SPEED = -8
START_POS = pygame.Rect('something')
def __init__(self):
super(self.__class__, self).__init__()
self.add(ingame.PLAYER)
class EnemyBullet(bullet.Bullet):
SPEED = 2
START_POS = pygame.Rect('something else')
def __init__(self):
super(self.__class__, self).__init__()
self.add(ingame.ENEMIES)
(请注意,是一个静态成员)的每个元素Bullet.actions
除了None
是一个包含在Bullet
. Bullet
不是要自己创建的;如果这是 C++,它将是一个抽象类。所以发生的事情是,Bullet
的子类搜索Bullet.actions
每一帧以决定下一步做什么,这取决于它们的状态(它们是否在移动,它们是否刚刚拍摄等)。但是,由于 的元素Bullet.actions
是自己的Bullet
方法,它的子类正在执行这些方法而不是它们自己的扩展版本(调用父方法)。由于内存使用原因,我不想复制这个回调字典。所以,我问这个;我怎样才能让一个子类的实例通过它的充满回调方法的父字典来查看,如果存在则执行它们自己的版本,如果不存在则执行它们的父版本?