美文网首页
Python中的__init__

Python中的__init__

作者: MontyOak | 来源:发表于2017-08-05 10:50 被阅读26次

许多有其他语言背景(比如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__作用是实例初始化。

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

相关文章

网友评论

      本文标题:Python中的__init__

      本文链接:https://www.haomeiwen.com/subject/wdyilxtx.html