所以我在做一个游戏,所有的对象都来自一个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)
现在,我遇到了另一个继承问题。观察下面的类,以及从中派生出来的两个类
^{pr2}$除了None
之外,Bullet.actions
(一个静态成员)的每个元素都是Bullet
中的一个函数。{< CD3}}不是自己创建的;如果是C++,它就是抽象类。因此,Bullet
的子类在Bullet.actions
的每一帧中搜索,根据它们的状态(它们是否在移动,是否刚刚被击中等等)来决定下一步要做什么。但是,由于Bullet.actions
的元素是Bullet
的own方法,所以它的子类执行这些方法,而不是它们自己的扩展版本(调用父方法)。我不想因为内存使用的原因而重复这段回调语句。所以,我要问这个;如何让一个子类的实例在它的父字典中查找满是回调方法,如果存在,执行它们自己的版本,如果不存在,则执行其父类的版本?
为什么不使用python内置机制进行继承呢?在
实例函数
actions
对于派生类B
是相同的。当被调用时,它得到实例self
,然后就像在实例本身上调用函数一样:Python的继承机制调用B
的方法,如果它在那里或者回退到A
的实现。在EDIT:l4mpi建议指出,这将每次创建映射,因此我将action_映射更改为一个属性。在
一种可能的解决方案是存储函数名而不是直接引用,并使用^{} 检索正确的引用:
对于加速,可以在初始化对象时预先计算此表:
^{pr2}$请注意,由于} ,因此可以将其放在
__init__
中的代码使用^{Bullet.__init__
中,并仅由其他类扩展。正如您已经调用了超级构造函数一样,不需要更改扩展类,甚至不需要对它们进行注释。在扩展BoppreH的答案,您可以通过在类创建时用正确的方法填充activity dict来消除
getattr
查找,方法如下:注意,
actions
是用一个不做任何操作的lambda填充的,如果一个操作的给定值是None
,这意味着您可以去掉update
中的if callable(...)
语句。在现在只需将decorator添加到类中:
^{pr2}$相关问题 更多 >
编程相关推荐