gpt4 book ai didi

Python __init__() 如何不覆盖重要功能?

转载 作者:行者123 更新时间:2023-12-01 03:44:24 24 4
gpt4 key购买 nike

我需要在类中添加另一个选项,一个简单的“edit=False”。无需完全重写 init()。我发现这段为kivy编写的代码:

class TitleBox(BoxLayout):
def __init__(self, **kwargs):
# make sure we aren't overriding any important functionality
super(TitleBox, self).__init__(**kwargs)

但是当我尝试出于我的目的进行编辑时,我收到:“TypeError: init() 最多接受 2 个参数(给定 3 个参数)”

class Person_Dialog(tkSimpleDialog.Dialog):
def __init__(self, edit=False, **kwargs):
super(Person_Dialog, self).__init__(**kwargs)
self.edit = edit

最佳答案

给定一个 __init__ 签名:

def __init__(self, edit=False, **kwargs):

当你这样做时:

add = Person_Dialog(root, 'Add person')

Python 创建一个实例并将其分配给 self 参数。然后它将 root 分配给 edit 参数。然后,它采用“添加一个人”,并且找不到其他位置参数来分配它。

要解决此问题,请向 __init__ 添加另一个参数:

class Person_Dialog(tkSimpleDialog.Dialog):
def __init__(self, parent, edit=False, **kwargs): # added parent argument
super(Person_Dialog, self).__init__(parent, **kwargs)
self.edit = edit

请注意,我们还将 parent 传递给父类(super class),因为 tkSimpleDialog.Dialog 具有此签名 __init__(self,parent, title=None) .

不幸的是,您的代码现在失败,并显示 TypeError: Must be type, not classobj 因为 tkSimpleDialog.Dialog 是旧式类,您不能使用 super() 与旧式类。 (Python 3 取消了旧式类,因此不会出现此问题。)

因此,要解决此问题,请将对 super() 的调用替换为对父类(super class)的直接引用:

class Person_Dialog(tkSimpleDialog.Dialog):
def __init__(self, parent, edit=False, **kwargs):
# referencing the superclass directly
tkSimpleDialog.Dialog.__init__(self, parent, **kwargs)
self.edit = edit

现在您的代码可以运行了。

关于Python __init__() 如何不覆盖重要功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39170964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com