Python 为什么对此类初始化器使用默认值None?

Python 为什么对此类初始化器使用默认值None?,python,tkinter,Python,Tkinter,我在这里测试了代码,效果很好 代码创建了一个应用程序类,如下所示: class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) 并创建具有以下内容的实例: root = Tk() app = Application(master=root) 然而,有一件事我不明白:为什么构造函数把一个None对象作为参数def\uu init\uuu(self,mast

我在这里测试了代码,效果很好

代码创建了一个
应用程序
类,如下所示:

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
并创建具有以下内容的实例:

root = Tk()
app = Application(master=root)

然而,有一件事我不明白:为什么构造函数把一个None对象作为参数
def\uu init\uuu(self,master=None):
但是他调用
Application()
类,然后给它传递一个
root=Tk()
实例?

这个类复制了
框架
构造函数;它也需要一个可选的
master
参数。您不必传入主窗口小部件,即使在这里代码确实传入了一个。见以下文件:

帧(主控=无,**选项)
(类)
小部件容器

这些方法包括相同的模式:


这样做可以使代码更加灵活;您现在可以创建一个不带master的
应用程序
实例,并将其传递给以后绑定任何Tk对象的代码。

master=None
表示如果调用方不提供参数,假设它没有值。@SelçukCihan:问题是为什么在这里使用它。TkInter有许多独特的约定。传统的做法是使用
master=None
编写
Frame
子类,即使您只在代码中的一个位置调用它们,并且该位置正在传递值。但这并非完全无用;您可能想在主应用程序之外的某个地方测试
框架
,或者有一天您可能会更改顶级代码……我现在明白您的解释了。非常感谢你。但是这个程序还有最后一个问题:他声明
类应用程序(Frame)
,而他通过传递一个Tk()对象而不是一个Frame来执行它。为什么这种矛盾会发生,Python会接受它?@Nakkini:
Application
Frame
的一个子类;这并不意味着初始化器只接受帧。这两个概念是完全正交的。@Nakkini:我认为你把类继承和类型声明混淆了。Python没有后者。什么是正交概念?@Nakkini:它们彼此成直角;e、 g.这两个概念截然不同。
from Tkinter import *

class Application(Frame):
    # ...

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

root = Tk()
app = Application(master=root)