-4 python
class A:
def __new__(cls):
return super(A,cls).__new__(cls)
Run Code Online (Sandbox Code Playgroud)
不,它没有。它创建了一个你想要的实例。
让我们分解你所有的陈述。
首先,我们声明一个新类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