【发布时间】:2015-07-27 23:41:15
【问题描述】:
我正在创建一个使用 Frame() 作为其基类的 GUI 类。
在我的 GUIclass 的 init 方法中,我想创建一个 Frame 小部件
现在我有:
class GUIclass(Frame):
def __init__(self, parent):
frame = Frame(self, parent)
但我在其他地方看到了第三行:
Frame.__init__(self, parent)
我是编程、python 和继承的新手,我想知道我是否正确理解了两者之间的区别。我保证,我做了很多研究和阅读,但我找不到任何可以完全清楚的东西:
在第一种情况下,我没有调用 init 方法,因为我创建了一个 Frame 对象(框架),并且当一个对象被创建时,它的 init 方法被 python 隐式调用。
在第二种情况下,调用类的 init 方法(我认为这是完全合法的?),因为没有创建 Frame 对象,因此不会自动执行。
对吗?
我也看过:
frame = Frame.__init__(self, parent)
这真的让我失望。这只是某人做了多余的事情还是有原因?
感谢您的帮助,我现在想慢慢来,并确保我完全理解我编写的每一行代码,而不是编写和运行我一半理解的整个程序。
【问题讨论】:
-
你应该使用第二个:
Frame.__init__(self, parent) -
第一个是不正确的,因为它在基于帧的对象的初始化程序中创建了一个不必要的帧。
-
第二个和第三个是对框架中父初始化器的超级调用,这样子类的初始化器将扩展基础,而不是覆盖基础。但是没有必要分配 super 调用的结果,使第三个不正确。
-
最好的解决方案是在 python2 中使用
super().__init__(*arguments)(假设是python3),这将是super(GUIclass, self).__init__(*arguments)(假设是新型类)。此外,PEP8 要求调用类GUIClass。 -
很遗憾,Tkinter 不支持超级调用,