class A:
def __new__(self):
self.__init__(self)
print("A's __new__() invoked") #print if called
def __init__(self):
print("A's __init__() invoked") #print if called
class B(A):
def __new__(self):
print("B's __new__() invoked") #print if called
def __init__(self):
print("B's __init__() invoked") #print if called
def main():
b = B() #create an object of B
a = A() #create an object of A
main()
为什么结果是“ B的 new ()调用A的 init ()调用A的 new ()调用?我想知道为什么B的<不会调用strong> init 方法。
答案 0 :(得分:1)
对于类Foo
,只有Foo.__init__
返回Foo()
的实例时,Foo.__new__
才会由Foo
自动调用。 B.__new__
返回None
,因此不会调用B.__init__
。
A.__init__
之所以被调用,是因为A.__new__
已显式调用了它,尽管它不是有意义的方式,因为它是由类A
本身而不是{{1}的实例传递的}。
A
调用Foo()
,您可以想象该方法的定义有点像
type(Foo).__call__(Foo)
如果您定义def __call__(cls, *args, **kwargs):
obj = cls.__new__(cls, *args, **kwargs)
if isinstance(obj, cls):
cls.__init__(obj)
return obj
,请注意以下几点:
__new__
是一个静态方法(尽管Python对此进行了特殊处理,因此您不需要__new__
装饰)会首先接收 class 参数,因此参数的名称应反映出来。
在大多数情况下,@staticmethod
的目的是调用__new__
以获取该类的实例,可能会做一些
在返回新对象之前对其进行后处理。
由于super().__new__
将在新实例上被自动调用(假设它的类型正确),因此__init__
不应调用__new__
本身。