如果问题不是关于正在发生的事情的正确陈述,或者结果证明是针对我描述的示例,我道歉。这正是我注意到的。我一直在学习如何在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__()
函数吗?
答案 0 :(得分:4)
是的,当您运行root=tk.Tk()
时,实例化了类tk.Tk
的实例 - 这意味着调用此类的__init__
。
在第二种方法中,您希望创建一个新类 - 特别是在较大的项目中可能非常有用,以便能够在其他任何地方移植它。
您无法向父__init__
方法添加内容,您可以通过重新定义它来覆盖它。因此,如果你仍然想要在tk.Tk.__init__()
中执行所有有用的东西,你必须明确地调用它。
有人可能会争辩说,更好的风格是使用super()
而不是硬编码父类名。但这与更复杂的项目相关......
答案 1 :(得分:1)
创建类对象时,会自动调用构造函数。这就是两个片段中发生的事情。第一个实例化Tk
类的对象,因此调用__init__
类的Tk
方法。在第二种方式中,您不是为Tk
类创建对象。您正在为App
课程创建一个对象。这并不意味着它将为它继承的类调用构造函数。你需要明确地调用它。