为什么我的实例行为不正确?

时间:2014-04-27 08:57:58

标签: python

为什么我可以设置高度但在实例化期间无法将函数传递给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)

1 个答案:

答案 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 传递给父类)