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的init方法没有被调用
对于类
Foo
,Foo.__init__
仅在Foo.__new__
返回Foo
的实例时由Foo()
自动调用B.__new__
返回None
,因此B.__init__
不会被调用调用
A.__init__
只是因为它是由A.__new__
显式调用的,尽管不是以有意义的方式调用,因为它是传递给类A
本身的,而不是A
的实例Foo()
调用type(Foo).__call__(Foo)
,您可以想象该方法的定义有点像如果定义
__new__
,请记住以下几点:__new__
是一个静态方法(尽管Python有特殊的大小写,因此您不需要@staticmethod
修饰),它接收一个类作为它的第一个参数,因此参数的名称应该反映出这一点对于大多数用例,
__new__
的目的是调用super().__new__
来获取类的实例,可能会执行一些操作 在返回新对象之前对其进行后处理由于
__init__
将在新实例上自动调用(假设它的类型正确),__new__
不应调用__init__
本身相关问题 更多 >
编程相关推荐