如何在创建过程中为实例分配属性?

时间:2014-04-27 23:32:45

标签: python

我还在学习Python,我对创建新实例感到有些困惑。在这个例子的底部,我正在创建一个BgImages的实例。我想给它分配一个字符串,所以我添加了collidetext =“这是一个测试”,然后我进入了BgImages构造函数,只需输入self.collidetext =“random string”。问题是当我打印slum.collisiontext时,它仍会打印“随机字符串”而不是“这是一个测试”。

我已经向其他人请求了这方面的帮助,我现在明白它与** kwargs有关,不会允许我想要做的事情。我希望有人能告诉我如何实现我想要实现的目标,以及为什么我所做的事情不起作用(用非专业人士的说法)。

class BgImages(ButtonBehavior, Image):
    def __init__(self, **kwargs):
        super(Npcs, self).__init__(**kwargs)
        self.collidetext="random string"

    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)



class gameApp(App):
    def build(self):
        slum=BgImages(source='slum.png', collidetext="this is a test1")
        police=BgImages(source='police.png', collidetext="this is a test2")
        listofwidgets=[]
        listofwidgets.append(slum)
        listofwidgets.append(police)

2 个答案:

答案 0 :(得分:0)

我认为您可能会在使用kwargs时稍微混淆这个问题。但无论如何,要在当前代码中执行您想要的操作,您可以执行以下操作:

def __init__(self, **kwargs):
    super(Npcs, self).__init__(**kwargs)
    self.collidetext=kwargs["collidetext"]

但是,通常你会使用实际的命名参数,可能是这样的:

def __init__(self, source=None, collidetext=None):
    super(Npcs, self).__init__(source=source)
    self.collidetext=collidetext

此外,您对def collisiontext(self,**kwargs):的使用表明您不确定kwargs是什么,而您只是重复该模式。我建议您在进一步学习之前花些时间学习一篇优秀的Python教程。

答案 1 :(得分:0)

您正在传递所需的关键字参数,但您没有在目标类中使用它们。

class BgImages(ButtonBehavior, Image):
    def __init__(self, **kwargs):
        super(Npcs, self).__init__(**kwargs)

        # do a dictionary lookup to get a random string if the argument is not passed
        self.collidetext= kwargs.get("collidetext","random string")