Mat*_*ero 5

不,它没有。它创建了一个你想要的实例。

让我们分解你所有的陈述。

首先,我们声明一个新类A

class A:
Run Code Online (Sandbox Code Playgroud)

默认情况下,所有类都继承自object,因此您的声明与以下内容相同:

class A(object):
Run Code Online (Sandbox Code Playgroud)

接下来,您覆盖 的定义__new__

def __new__(cls):
Run Code Online (Sandbox Code Playgroud)

这是一个接受class您要实例化的对象的函数。

接下来,我们调用我们的基类__new__方法:

super(A, cls) # This refers to the base class of A, which is object
.__new__(cls) # Calls object.__new__(cls), with cls being the class you want to instantiate
Run Code Online (Sandbox Code Playgroud)

object.__new__ 做正确的工作,事实上你可以传入任何你想要的类,它会正确地实例化它。

所以, yourA.__new__只是 的一个委托object.__new__,所以真的, yourA.__new__完全没用,你可以删除它,一切都会一样。

话虽如此,当你这样做时A(),这将触发A.__new__(A),这将触发object.__new__(A),所以你最终会得到一个 的实例A

如果你有以下课程:

class B(A):
    def __new__(cls):
        super(B, cls).__new__(cls)
Run Code Online (Sandbox Code Playgroud)

流程是一样的。

B()会触发B.__new__(B)哪个会触发A.__new__(B),哪个会触发object.__new__(B),所以你最终会得到一个实例B