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

2024-05-29 05:11:02 发布

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

我还在学习Python,对创建新实例有点困惑。在这个示例的底部,我创建了一个bgmages实例。我想给它分配一个字符串,所以我添加了collidetext=“this is a test”,然后我进入bgmages构造函数并简单地将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)

Tags: 实例selfinitisondefthiskwargs
2条回答

我想你可能会把这个问题和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教程

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

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")

相关问题 更多 >

    热门问题