我不明白为什么结果是“B的new调用了A的init调用了A的new调用了”

2024-03-29 09:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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方法没有被调用


Tags: of方法selfannewifobjectinit
1条回答
网友
1楼 · 发布于 2024-03-29 09:19:17

对于类FooFoo.__init__仅在Foo.__new__返回Foo的实例时由Foo()自动调用B.__new__返回None,因此B.__init__不会被调用

调用A.__init__只是因为它是由A.__new__显式调用的,尽管不是以有意义的方式调用,因为它是传递给类A本身的,而不是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__,请记住以下几点:

  1. __new__是一个静态方法(尽管Python有特殊的大小写,因此您不需要@staticmethod修饰),它接收一个作为它的第一个参数,因此参数的名称应该反映出这一点

  2. 对于大多数用例,__new__的目的是调用super().__new__来获取类的实例,可能会执行一些操作 在返回新对象之前对其进行后处理

  3. 由于__init__将在新实例上自动调用(假设它的类型正确),__new__不应调用__init__本身

相关问题 更多 >