Python类:继承与实例化

时间:2015-05-15 22:43:11

标签: python class tkinter

我正在创建一个使用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)   

真的让我失望了。这只是某人做了多余的事情还是有理由这样做?

感谢您的帮助,我想暂时放慢速度,确保我完全理解我编写的任何代码行,而不是编写和运行我不太理解的整个程序。

2 个答案:

答案 0 :(得分:8)

你应该致电

super(GUIclass, self).__init__(parent)

这是调用(全部)继承的__init__()方法的正确方法。与上述

相比,它在许多情况下具有相同的结果
Frame.__init__(self, parent)

只缺少关于继承关系的抽象,并将类Frame表示为您可能想要调用__init__()方法的唯一类(稍后会详细介绍)。

还提到了

frame = Frame(self.parent)

在这种情况下是错误的。它属于另一种对象关系模式,即内容关系,而不是继承关系(你的目标)。它将创建Frame的新对象,而不是初始化自己的Frame部分;在继承关系中, Frame,因此您必须将yourself初始化为一个,并初始化您的专用部分(这是在{{1}的其余部分完成的}} 方法)。在内容关系模型中,您只需 一个__init__()

现在,那"轻微"我在调用Framesuper(GUIclass, self).__init__(parent)之间提到的差异?

要理解您需要深入了解继承关系及其提供的各种可能性,尤其是多重继承。

考虑一个菱形关系模型,如下所示:

Frame.__init__(self, parent)

在您当前的场景中,您只有左上角的两个类,但是一个人永远不会知道将会发生什么,并且您应该始终以某种方式进行编码,以便代码的下一个用户保留所有选项。 / p>

在这个菱形图案中,您 Frame / \ GUIclass SomeOtherClass \ / AnotherClass 继承AnotherClassGUIClass,而SomeOtherClassFrame都继承Frame.__init__(self, parent)

如果您现在在GUIclassSomeOtherClass中使用模式__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不支持超级电话