我有一个关于 Python 中子类的
init
方法的问题。
在上图中,子类 Developer 是从父类 Employee 定义的。在 Developer 中,使用
__init__
(即父类的 super().__init__
方法)定义 __init__
方法,并添加父类中不存在的额外属性 prog_lang
。这我明白了。然而,在下面的例子中:
子类 App 是从 tkinter 模块的父类 tk.Tk 定义的。这里,使用相同的
super().__init__
方法,在实例化时将父类的所有属性赋予子类的实例。然而,然后,不要像前面的示例那样用等号编写“额外”属性,它看起来像这样:
self.title = 'Classed based app'
self.geometry = '600x600'
...
我们有:
self.title('Classed based app')
self.geometry('600x600')
...
我的问题是为了测试我的理解:这是因为父类
tk.Tk
的构造方法已经有一个title
和geometry
属性,如果在生成类的实例时未输入任何值,则这些属性将被设置为一些默认值?此外,父类tk.Tk
还有一个方法title
,可以为实例的title
属性设置新值。这张草图中的一些东西:
class Tk:
def __init__(self, title = default,...)
self.title = title
....
def title(self, new_title):
self.title = new_title
因此,在子类App的构造方法中,使用等号设置属性(
self.title = 'Classes based app'
)和使用方法(self.title('Classes based app')
)是等价的。
我尝试在网上寻找 tk.Tk() 类“手册”,但没有找到。
我留下了截图来源的YouTube视频的链接:
tkinter 不是用 python 编写的,您必须坚持使用绑定所做的任何操作来将其功能公开给 python。在这种情况下,
title
等是 setter 方法,而不是普通属性。标题实际上保存在底层 tcl 对象中。您可以添加 print(self.title)
,您将看到它是一个绑定方法。