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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,376评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,253评论 18 399
  • 摘要 本文讨论了Python中__init__和__new__方法。 __new__和__init__具有不同的功...
    耀凯考前突击大师阅读 8,319评论 7 22
  • python的函数参数传递 看两个例子: 所有变量都可以理解为内存中一个对象的“引用”,或者,可以看做C中的vio...
    marvinxu阅读 6,008评论 2 30
  • 我们读书,因为我们孤单,我们读书,然后就不孤单,我们并不孤单。 ——摘自《岛上书店》 1、...
    Miss懵阅读 2,183评论 12 46

友情链接更多精彩内容