许多有其他语言背景(比如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__
作用是实例初始化。
最后,英文好的童鞋看这里