gpt4 book ai didi

python - 子类化时使用(误用)super()

转载 作者:太空宇宙 更新时间:2023-11-04 01:17:04 26 4
gpt4 key购买 nike

在考虑如何将 tkinter FrameLabelFrame 子类化以便它们位于正确的父级上时,我发现很多答案表明 super() .__init__ 在子类化时优于 BaseClass.__init()__

于是我试了试,看看到底是怎么回事,结果好像根本不管用。在 python 2.7 中,它提示参数的类型。在 3.4 中,它说 master 有多个定义。如下 super 注释掉后,它按预期工作。我做错了什么?

# import Tkinter as tki   # py 2.7
import tkinter as tki # py 3.4

class App(tki.LabelFrame):
def __init__(self, parent):
tki.LabelFrame.__init__(self, master=parent, text='inner')
# super().__init__(self, master=parent, text='inner') #py 3.4
# super(App, self).__init__(self, master=parent, text='inner') #py 2.7
# super(App, self).__init__(master=parent, text='inner') #py 2.7

self.quit = tki.Button(self, text='quit', command=exit)
self.quit.grid()

if __name__ == '__main__':
root = tki.Tk()
root.title('nesting testing')

outer = tki.LabelFrame(root, text='outer level')
outer.pack()

app = App(outer)
app.pack()

root.mainloop()

在对 super().__init__() 的调用中删除 self 是我尝试的第一件事,但在 py2.7 中我仍然遇到同样的错误消息,无论它是否在其中。

没有self:

Traceback (most recent call last):  
File "C:\Python\TESTS\test_super.py", line 21, in <module>
app = App(outer)
File "C:\Python\TESTS\test_super.py", line 9, in __init__
super(App, self).__init__(master=parent, text='inner') #py 2.7
TypeError: must be type, not classobj

使用self:

Traceback (most recent call last):  
File "C:\Python\TESTS\test_super.py", line 21, in <module>
app = App(outer)
File "C:\Python\TESTS\test_super.py", line 8, in __init__
super(App, self).__init__(self, master=parent, text='inner') #py 2.7
TypeError: must be type, not classobj

错误消息与我 drop self 保持相同的事实表明这不是问题,但它与 BaseClass 调用一起工作的事实让我感到困惑,因为其他参数可能有什么问题。

最佳答案

如果我没记错的话

super().__init__(self, master=parent, text='inner')          #py 3.4
super(App, self).__init__(self, master=parent, text='inner') #py 2.7

应该是——

super().__init__(master=parent, text='inner')          #py 3.4
super(App, self).__init__(master=parent, text='inner') #py 2.7

因为你不应该将 self 作为参数传递给 super 的 __init__

事实上,当使用实例方法时,你不应该将self显式传递给任何方法,self是在解释器调用时自动提供的

顺便说一句,

    tki.LabelFrame.__init__(self, master=parent, text='inner')
super().__init__(self, master=parent, text='inner') #py 3.4
super(App, self).__init__(self, master=parent, text='inner') #py 2.7
super(App, self).__init__(master=parent, text='inner') #py 2.7

所有这些调用都是多余的。您应该只使用其中一个。我更喜欢 -

    super().__init__(master=parent, text='inner')          #py 3.4

    super(App, self).__init__(master=parent, text='inner') #py 2.7

但是如果你更喜欢使用第一个 -

    tki.LabelFrame.__init__(self, master=parent, text='inner')

确保你删除 self 并使其成为 -

    tki.LabelFrame.__init__(master=parent, text='inner')

关于python - 子类化时使用(误用)super(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746313/

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