为什么我可以设置高度但在实例化期间无法将函数传递给collidetext
?
如果我选中slum.height
,则为10
(因为我在10
实例化时将其设为slum
),但如果我调用slum.collisiontext
,在创建实例时,它只调用somefunction
而不是我分配给slum
的函数。
我不明白。
class BgImages(ButtonBehavior, Image):
def __init__(self, **kwargs):
super(Npcs, self).__init__(**kwargs)
self.collidetext=somefunction
self.height=0
def collisiontext(self,**kwargs):
return self.collidetext()
class MainCharacter(Image):
def __init__(self, **kwargs):
super(MainCharacter, self).__init__(**kwargs)
self._keyboard = Window.request_keyboard(None, self)
if not self._keyboard:
return
self._keyboard.bind(on_key_down=self.on_keyboard_down)
self._keyboard.bind(on_key_up=self.on_keyboard_up)
elif keycode[1] == 'up':
for i in listofwidgets:
if i.collide_point(self.x,self.top):
self.y -=1
i.collisiontext()
class gameApp(App):
def build(self):
slum=BgImages(source='slum.png', collidetext=slumnotice, height=10)
police=BgImages(source='police.png', collidetext=policenotice)
listofwidgets=[]
listofwidgets.append(slum)
listofwidgets.append(police)
答案 0 :(得分:0)
您应该将 __ init __ 中的作业更改为
self.collidetext = kwargs['collidetext']
函数定义中的** kwargs 构造允许您向函数发送任何一组命名参数 - 在函数中它们将作为字典可见
In [64]: def test(**kwargs):
....: print locals()
....:
In [66]: test(advice='learn')
{'kwargs': {'advice': 'learn'}}
另一种方法是在 __ init __ 声明中明确定义位置函数参数 - 在kwargs之前
def __init__(self, collide_func, **kwargs):
super(Npcs, self).__init__(**kwargs)
self.collidetext=collide_func
self.height=0
如果您不打算使用关键字参数 - 或者只是需要位置参数 - 您根本不需要添加构造(在 __ init __ 中您需要 ** kwargs 传递给父类)