Python:为什么要调用'__init__'而不是className()?

4

既然调用className()会执行__init__(args)中的代码,那么在下面的代码中,为什么有人明确地调用__init__呢?

class Example(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)   

在这两种方法调用之间,实际执行的代码是否有任何区别,或者选择__init__()而不是className()只是任意的呢?

运行Python 3.4

1个回答

9
className() 不仅调用 __init__,还调用 __new__,创建一个类的新实例。因此,调用 Frame() 不会在同一个 self 对象上进行超类初始化;它会创建一个新对象并对其进行初始化。
当您想要仅在已经创建的特定实例上运行 仅仅__init__ 时,您可以调用它。通常,这是在您想让超类在子类的初始化之上执行其初始化的情况下使用的。

那么调用Frame的__init__就像在Java中调用super()一样吗? - AllTradesJack
@joshsvoss:可能吧。我不太了解Java。在这个网站上回答问题的经验告诉我,如果人们试图理解Python实际做了什么,而不是将其映射到Java上,他们通常会获得更好的理解。 - BrenBarn
你也可以使用 super(Frame, self).__init__(parent),但我承认在这种情况下我并不完全理解它们之间的区别。 - daniel
1
@daniel:是的,但那是一个不同的问题。基本上,如果您稍后重新排列类层次结构,则“super”方法更加灵活。 - BrenBarn
啊,太好了。谢谢 @BrenBarn - daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接