class A: def __new__(self): self.__init__(self) print("A's __new__() invoked") def __init__(self): print("A's __init__() invoked") class B(A): def __new__(self): print("B's __new__() invoked") def __init__(self): print("B's __init__() invoked") def main(): b = B() a = A() main()
时间: 2023-06-11 10:09:58 浏览: 154
这段代码定义了两个类 A 和 B,其中 B 继承自 A。在 main() 函数中,分别创建了 A 和 B 的实例。运行代码会输出以下内容:
```
B's __new__() invoked
A's __new__() invoked
A's __init__() invoked
B's __init__() invoked
A's __init__() invoked
```
可以看出,当创建 B 的实例时,先调用了 B 的 __new__() 方法,然后调用了 A 的 __new__() 方法。接着,先调用了 A 的 __init__() 方法,再调用了 B 的 __init__() 方法。最后,又调用了 A 的 __init__() 方法。
这是因为在创建对象时,先调用类的 __new__() 方法创建对象实例,再调用 __init__() 方法进行初始化。在继承关系中,如果子类没有实现 __new__() 方法,那么父类的 __new__() 方法会被调用。而如果子类实现了 __new__() 方法,那么父类的 __init__() 方法仍然会被调用。
相关问题
class A: def __new__(self): self.__init__(self) print("A's __new__() invoked") def __init__(self): print("A's __init__() invoked") class B(A): def __new__(self): print("B's __new__() invoked") def __init__(s
elf):
print("B's __init__() invoked")
b = B()
在运行这段代码时,输出的结果是:
B's __new__() invoked
A's __init__() invoked
B's __init__() invoked
这是因为在创建B类的实例b时,首先会调用B类的__new__()方法来创建实例对象,然后再调用实例对象的__init__()方法来初始化实例。由于B类没有定义__new__()方法,所以调用的是其父类A的__new__()方法。在A的__new__()方法中,首先调用了A的__init__()方法,然后输出"A's __new__() invoked"。接着返回一个A类的实例对象,这个实例对象会被传递给B类的__init__()方法,用于初始化B类的实例。因此,输出的结果是"B's __new__() invoked"、"A's __init__() invoked"和"B's __init__() invoked"。
详细解释这段代码:class A: def __new__(self): self.__init__(self) print("A's __new__() invoked") def __init__(self): print("A's __init__() invoked") class B(A): def __new__(self): print("B's __new__() invoked") def _
这段代码定义了两个类A和B,其中B是A的子类。类A中定义了__new__()和__init__()方法,而类B中只定义了__new__()方法。
__new__()方法在Python中是一个特殊的方法,它在实例对象创建时被调用,用于创建并返回一个新的实例对象。在类A中的__new__()方法中,首先调用了类A的__init__()方法,然后输出"A's __new__() invoked"。这里需要注意的是,通常情况下我们不需要在__new__()方法中调用__init__()方法,因为实例对象创建时会自动调用__init__()方法来进行初始化。在这里调用__init__()方法只是为了演示。
__init__()方法也是一个特殊的方法,在实例对象创建时被自动调用,用于初始化实例。在类A中的__init__()方法中,只输出"A's __init__() invoked"。
类B中的__new__()方法中只输出"B's __new__() invoked",没有调用任何方法。由于B是A的子类,所以在创建B类的实例时,会先调用B的__new__()方法来创建一个新的实例对象。由于B类没有定义__new__()方法,所以会调用其父类A的__new__()方法。在A的__new__()方法中,首先调用了A的__init__()方法,然后输出"A's __new__() invoked"。接着返回一个A类的实例对象,这个实例对象会被传递给B类的__init__()方法,用于初始化B类的实例。因此,最终输出的结果是"B's __new__() invoked"、"A's __init__() invoked"和"B's __init__() invoked"。
阅读全文