Python中的__init__

许多有其他语言背景(比如C,C++等)的初学者都会以为在Python中,__init__方法充当着类似与类构造方法的角色。就大多数使用场景来看,这么理解似乎没有什么问题:当实例化一个对象的时候,使用my_class = MyClass(args)就会返回一个实例给my_class变量。

那实际上,在实例化一个类的时候,到底是一个怎样的过程呢?首先要说的是,__init__并不是一个构造方法,它的工作是在类的对象创建完成之后,对类的变量属性进行初始化。那类的对象又是由谁来创建的呢?

答案是__new__方法,它才是传统意义上的构造方法。

__init____new__又有什么不同点呢?

  • __init__定义为object.__init__(self,*args),而__new__定义为object.__new__(cls,*args),由定义不难看出,__init__是一个实例方法,而__new__是一个静态方法。
  • __new__会返回一个创建的实例,__init__没有返回值,当__new__返回类的对象之后,__init__方法才会执行,若无对象返回,则__init__不会被调用。
  • 二者的功能明显不同:__new__用于创建一个实例,__init__用于初始化一个实例
  • 大多数情况下,我们需要重写__init__来实现实例对象的变量属性初始化,而只有在子类继承不可变类型的时候(比如:str,int,tuple等),才需要重写__new__
  • 在实现工厂模式、单例模式或者元类编程的时候,可能会需要显式重写__new__来控制类的创建。
  • __metaclass__作用是类创建,__new__作用是实例创建,__init__作用是实例初始化。

最后,英文好的童鞋看这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,898评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,308评论 19 139
  • 原文出处: for-in 一、__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 i...
    PyChina阅读 8,014评论 1 3
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,429评论 11 349
  • issued a red alert for fog 大雾红色预警renewed an orange alert ...
    Maei阅读 3,244评论 0 0