在Python中__new__会覆盖__init__吗

问题描述 投票:0回答:1

我有以下代码:

class Demo:
    def __new__(self):
        self.__init__(self)
        print("Demo's __new__() invoked")
    def __init__(self):
        print("Demo's __init__() invoked")
                      
class Derived_Demo(Demo):
    def __new__(self):
        print("Derived_Demo's __new__() invoked")
    def __init__(self):
        print("Derived_Demo's __init__() invoked")

def main():
    obj1 = Derived_Demo()
    obj2 = Demo()

main()

我试图理解执行顺序:

  1. 派生类中的__new__首先被调用

  2. 为什么派生类中的_init_不调用next?

python init derived-class base-class
1个回答
0
投票

根据您所看到的输出,这是一个执行顺序,应该更有意义。

  1. "Derived_Demo's __new__() invoked"
    - 因为您调用
    Derived_Demo
    ,并且
    __new__
    始终会首先被调用。
  2. 你的
    Derived_Demo.__new__
    返回
    None
    ,意思是在到达
    Derived_Demo.__init__
    之前,
    obj1
    None
    (放一个
    print(obj1) immidately after it is defined to see
    )。
  3. "Demo's __init__() invoked"
    - 因为首先调用
    Demo.__new__
    ,但你在
    __init__
    中显式调用
    __new__
    (这是一种反模式,但 Python 并不禁止它)。
  4. "Demo's __new__() invoked"
    - 预计在
    __init__
    被调用后。
© www.soinside.com 2019 - 2024. All rights reserved.