python中__new__和__init__的差异

new() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 init() 负责将类的实例化,而在 init() 启动之前,new() 决定是否要使用该 init() 方法,因为new() 可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。

如果将类比喻为工厂,那么init()方法则是该工厂的生产工人,init()方法接受的初始化参数则是生产所需原料,init()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而new()则是生产部经理,new()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。

initnew 最主要的区别在于:
1.init 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2.new 通常用于控制生成一个新实例的过程。它是类级别的方法。

new() 方法的特性:

new() 方法是在类准备将自身实例化时调用。
new() 方法始终都是类的静态方法,即使没有被加上静态方法装饰器。

使用举例

部分代码在github中做了整理
https://github.com/jiaxiaolei/myspace/tree/master/study/python/new_init

扩展阅读

详解Python中的initnew
https://my.oschina.net/liuyuantao/blog/747164
一个备份:
http://python.jobbole.com/86506/

简介:
解释比较好。 参考文章内容,整理了代码。还提到了“python中的metaclass和new的关系”

这样便是init最普通的用法了。但init其实不是实例化一个类的时候第一个被调用 的方法。当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 new 方法。

事实上如果(新式)类中没有重写new()方法,即在定义新式类时没有重新定义new()时,Python默认是调用该类的直接父类的new()方法来构造该类的实例,如果该类的父类也没有重写new(),那么将一直按此规矩追溯至object的new()方法,因为object是所有新式类的基类。

[深入Python]newinit
http://www.cnblogs.com/tuzkee/p/3540293.html
简介:

[Python] Python 之 new() 方法与实例化
http://www.cnblogs.com/ifantastic/p/3175735.html

你可能感兴趣的:(python中__new__和__init__的差异)