您的位置:首页 >Python中__new__与__init__执行机制解析
发布于2025-08-11 阅读(0)
扫一扫,手机访问

在Python中,对象的生命周期涉及两个关键的特殊方法:__new__和__init__。理解它们的职责和执行顺序对于编写健壮的面向对象代码至关重要。
执行顺序总结: 当你通过 ClassName() 创建一个对象时,Python解释器会首先调用 ClassName.__new__() 来创建实例。如果 __new__ 方法成功返回了一个该类的实例(或其子类的实例),那么接下来解释器会自动调用该实例的 __init__() 方法进行初始化。
为了更好地理解__new__和__init__的交互,特别是当它们被非标准地实现时,我们来看一个具体的例子。
class Demo:
def __new__(self): # 注意:这里缺少 cls 参数,且未返回实例
self.__init__(self) # 反模式:在 __new__ 中显式调用 __init__
print("Demo's __new__() invoked")
def __init__(self):
print("Demo's __init__() invoked")
class Derived_Demo(Demo):
def __new__(self): # 注意:这里缺少 cls 参数,且未返回实例
print("Derived_Demo's __new__() invoked")
def __init__(self):
print("Derived_Demo's __init__() invoked")
def main():
obj1 = Derived_Demo()
obj2 = Demo()
print(f"obj1 is: {obj1}") # 观察 obj1 的值
print(f"obj2 is: {obj2}") # 观察 obj2 的值
main()运行上述代码,输出如下:
Derived_Demo's __new__() invoked Demo's __init__() invoked Demo's __new__() invoked obj1 is: None obj2 is: None
执行流解析:
obj1 = Derived_Demo() 的创建过程:
obj2 = Demo() 的创建过程:
从输出结果可以看出,obj1 和 obj2 都变成了 None,这与我们通常创建对象的预期行为大相径庭。
一个设计良好的__new__方法应遵循以下约定:
def __new__(cls, *args, **kwargs):
# ...class MyClass:
def __new__(cls, *args, **kwargs):
instance = super().__new__(cls) # 创建实例
return instance # 返回实例在上述案例中,Demo.__new__中显式调用了self.__init__(self)。这是一个应该避免的反模式。
为什么是反模式?
通过遵循这些原则,你可以更有效地利用Python的面向对象特性,并避免在对象创建和初始化过程中常见的陷阱。
上一篇:禁用USB存储设置方法详解
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9