当我从另一个类继承时,为什么__init __()必须使用两次?

时间:2016-03-12 16:43:42

标签: python python-2.7 inheritance tkinter

如果问题不是关于正在发生的事情的正确陈述,或者结果证明是针对我描述的示例,我道歉。这正是我注意到的。我一直在学习如何在Python 2.7中使用Tkinter制作GUI,并且我已经学习了几个教程,并且我已经看到了几种不同的样式来构造代码。

以下是一种方法:

import Tkinter as tk

root = tk.Tk()
root.title("My App")
root.mainloop()

我看到的另一种方式是:

import Tkinter as tk

class App(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        tk.Tk.title("My App")

root = App()
root.mainloop()

第二种方法是创建一个继承自App类的类tk.Tk,从而使App成为tk.Tk的子类? def __init__(self):是我定义的类App的构造函数。但是我还必须从__init__()类调用tk.Tk函数。如果这是真的,那为什么呢?当我运行root = tk.Tk()时,会调用其__init__()函数吗?

2 个答案:

答案 0 :(得分:4)

是的,当您运行root=tk.Tk()时,实例化了类tk.Tk的实例 - 这意味着调用此类的__init__

在第二种方法中,您希望创建一个新类 - 特别是在较大的项目中可能非常有用,以便能够在其他任何地方移植它。 您无法向父__init__方法添加内容,您可以通过重新定义它来覆盖它。因此,如果你仍然想要在tk.Tk.__init__()中执行所有有用的东西,你必须明确地调用它。

有人可能会争辩说,更好的风格是使用super()而不是硬编码父类名。但这与更复杂的项目相关......

答案 1 :(得分:1)

创建类对象时,会自动调用构造函数。这就是两个片段中发生的事情。第一个实例化Tk类的对象,因此调用__init__类的Tk方法。在第二种方式中,您不是为Tk类创建对象。您正在为App课程创建一个对象。这并不意味着它将为它继承的类调用构造函数。你需要明确地调用它。