Python __new__ 方法深度解析:实例化机制与 __init__ 的区别
本文深入解析 Python 中 __new__ 方法的运行机制,阐明其作为真正实例化方法的角色,负责创建对象框架。重点对比 __new__ 与 __init__ 的区别:前者返回类实例以触发后者,若返回其他类实例则仅调用对应类的构造器。通过代码示例说明如何重写 __new__ 以控制对象创建过程,适用于理解 Python 对象模型及高级编程场景。
__new__ 方法是什么?
__new__ 方法本质上是用于创建对象实例的核心方法。
当类准备进行自身实例化操作时,Python 解释器会调用 __new__() 方法。
一个类可以定义多个位置参数和命名参数。在实例化流程中,Python 会优先调用 __new__() 方法,随后才调用 __init__() 方法:
def new(cls, *args, **kwargs): …
该方法的第一个参数 cls 代表当前正在被实例化的类本身。
若需获取当前类的实例,应在当前类的 __new__() 方法内部调用其父类的 __new__() 方法。
例如,若当前类直接继承自 object,则当前类的 __new__() 方法返回的对象应为:
def new(cls, *args, **kwargs): … return object.new(cls)
通常而言,当类开始实例化时,__new__() 方法会返回 cls(即当前类)的实例。随后,该类的 __init__() 方法作为构造方法,会接收此实例(即 self)作为其第一个参数,并依次接收 __new__() 方法中获取的位置参数和命名参数。
注意:如果 __new__() 没有返回 cls(即当前类)的实例,则当前类的 __init__() 方法将不会被调用。
若 __new__() 返回其他类的实例,则系统仅会调用被返回的那个类的构造方法。
class Foo(object): def init(self, *args, **kwargs): pass def new(cls, *args, **kwargs): return object.new(Stranger, *args, **kwargs)
class Stranger(object): pass
foo = Foo() print(type(foo)) 》》》》<class ‘main.Stranger'>
因此,可以这样描述 __new__() 与 __init__() 的区别:在新式类中,__new__() 才是真正的实例化方法,它负责为类提供外壳以制造出实例框架;随后调用该框架内的构造方法 __init__() 使对象内容丰满。
若以建房子作比喻,__new__() 方法负责开发地皮、打下地基,并将原材料存放在工地。
而 __init__() 方法负责从工地取用材料,建造出符合地皮开发招标书中规定的大楼;__init__() 负责大楼的细节设计、建造及装修,使其具备交付给客户的条件。
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对本站的支持。如果你想了解更多相关内容请查看下面相关链接
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









