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

2024-04-24 16:40:14 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么我可以设置高度,但不能在实例化期间将函数传递给collidetext?你知道吗

如果我选中slum.height,它就是10(因为当slum被实例化时我将它设置为10),但是如果我调用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)

Tags: 实例selfinitondefkwargsclassheight
1条回答
网友
1楼 · 发布于 2024-04-24 16:40:14

您应该将\uu init\uuem>中的作业更改为

self.collidetext = kwargs['collidetext']

**kwargs函数定义中的构造允许您将任何一组命名参数发送到函数-在函数中,它们将作为字典显示

In [64]: def test(**kwargs):
   ....:     print locals()
   ....:     

In [66]: test(advice='learn')
{'kwargs': {'advice': 'learn'}}

另一种方法是在kwargs之前的声明中显式定义位置函数参数

def __init__(self, collide_func, **kwargs):
    super(Npcs, self).__init__(**kwargs)
    self.collidetext=collide_func
    self.height=0

如果您不打算使用关键字参数,或者只需要位置参数,那么您根本不需要添加构造(在\uuu init\uuuuuuuuuuuuu中,您需要**kwargs来传递给父类)

相关问题 更多 >