对 def __init__ 中的 __init__ 方法感到困惑

Posted

技术标签:

【中文标题】对 def __init__ 中的 __init__ 方法感到困惑【英文标题】:confused about __init__ method inside of def __init__ 【发布时间】:2017-06-06 05:59:15 【问题描述】:

在以下代码中:

import tkinter as tk

    class CardShuffling(tk.Tk):
        background_colour = '#D3D3D3'
        deck_size = 52

        def __init__(self):
            tk.Tk.__init__(self) # What does this do?

我对最后一行的目的感到困惑.. CardShuffling 的一个实例继承自tk.Tk,最后一行不只是重复CardShuffling(tk.Tk) 已经处理的内容吗?

【问题讨论】:

【参考方案1】:

CardShuffling(tk.Tk) 只会使类 CardShuffling 成为 tk.Tk 的子类。你的新类继承了这个类的所有方法。

但是如果你创建一个新对象,你仍然必须调用该基类的构造函数(以新对象作为参数)。想象在父类的构造函数中有一行self.a = 0。当您初始化一个新实例时,您的子类必须运行此行; CardShuffling(tk.Tk) 不能为你做到这一点;你需要运行父类的__init__

在 python 3 中通常的做法是

def __init__(self):
    super().__init__()

在这种情况下与

相同
def __init__(self):
    tk.Tk.__init__(self)

也许这个article on inheritance 有帮助,甚至还有一个免费的book chapter。

【讨论】:

我已经阅读了这篇文章,但仍然有些困惑。 CardShuffling 是 tk.Tk 的子类,因此它具有 tk.Tk 的所有方法 - 但我们仍然需要在子类的构造函数中明确声明?你能充实self.a = 0的评论吗?如果 CardShuffling(tk.Tk) 从父构造函数继承了所有内容,为什么不从父构造函数运行该行.. 因为self 在您定义类时不存在。当您声明:cs = CardShuffling() 时,您只会得到一个实例(具有self 的东西)。现在cs 是一个实例。只是现在您可以将像 self.a (然后将转换为 cs.a)这样的成员附加到该实例。

以上是关于对 def __init__ 中的 __init__ 方法感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

如何从 __init__ 访问 __init_subclass__ 中的变量?

Python中的__init__和__new__

关于def __init__(self)

python中的__init__和__new__的区别

对Python中的超级函数和自相混淆

python之类中的super函数