我正在创建一个使用Frame()作为基类的GUI类。
在我的GUIclass的init方法中,我想创建一个Frame小部件
现在我有:
class GUIclass(Frame):
def __init__(self, parent):
frame = Frame(self, parent)
但是我已经在其他地方看到了第三行:
Frame.__init__(self, parent)
我是编程,python和绝对继承的新手,我想知道我是否正确理解了两者之间的区别。我承诺,我做了大量的研究和阅读,但我找不到任何能让它完全清楚的东西:
在第一种情况下,我没有在创建Frame对象(框架)时调用init方法,并且在创建对象时,它的init方法由python隐式调用。
在第二个场景中,一个是在类上调用init方法(我认为这是完全合法的?)因为没有创建Frame对象,因此不会自动执行。
是吗?
我也看到了:
frame = Frame.__init__(self, parent)
真的让我失望了。这只是某人做了多余的事情还是有理由这样做?
感谢您的帮助,我想暂时放慢速度,确保我完全理解我编写的任何代码行,而不是编写和运行我不太理解的整个程序。
答案 0 :(得分:8)
你应该致电
super(GUIclass, self).__init__(parent)
这是调用(全部)继承的__init__()
方法的正确方法。与上述
Frame.__init__(self, parent)
只缺少关于继承关系的抽象,并将类Frame
表示为您可能想要调用__init__()
方法的唯一类(稍后会详细介绍)。
还提到了
frame = Frame(self.parent)
在这种情况下是错误的。它属于另一种对象关系模式,即内容关系,而不是继承关系(你的目标)。它将创建类Frame
的新对象,而不是初始化自己的Frame
部分;在继承关系中, 是Frame
,因此您必须将yourself
初始化为一个,并初始化您的专用部分(这是在{{1}的其余部分完成的}} 方法)。在内容关系模型中,您只需 一个__init__()
。
现在,那"轻微"我在调用Frame
和super(GUIclass, self).__init__(parent)
之间提到的差异?
要理解您需要深入了解继承关系及其提供的各种可能性,尤其是多重继承。
考虑一个菱形关系模型,如下所示:
Frame.__init__(self, parent)
在您当前的场景中,您只有左上角的两个类,但是一个人永远不会知道将会发生什么,并且您应该始终以某种方式进行编码,以便代码的下一个用户保留所有选项。 / p>
在这个菱形图案中,您 Frame
/ \
GUIclass SomeOtherClass
\ /
AnotherClass
继承AnotherClass
和GUIClass
,而SomeOtherClass
和Frame
都继承Frame.__init__(self, parent)
。
如果您现在在GUIclass
和SomeOtherClass
中使用模式__init__()
,请使用__init__()
AnotherClass
方法调用Frame
方法}将导致__init__()
super
方法的双倍调用。这通常不是预期的,并且要注意不会发生这种情况,__init__()
呼叫是发明的。一个体面的调用命令只需要调用每个tell application "Terminal"
do script "ex /tmp/test; exit"
end tell
方法并且只调用一次。
答案 1 :(得分:1)
你必须使用Frame.__init__(self, parent)
,因为Tkinter不支持超级电话