Python 的 __new__()方法总结:

__new__()方法总结:

原型:

__new__(cls, *args, **kwargs)

参数说明:

cls:当前正在实例化的类型对象,如当输入myClass = MyClass(*args, **kwargs) 后,此时cls为MyClass;

其余参数*args, **kwargs与传入__init__()方法的参数相同,为创建实例时传入的参数。

其他说明:

只有继承自object类的新式类才有__new__方法,经典类则没有__new__() 方法。因为object由内建元类type产生,而元类type中有__new__方法。一般很少用到__new__,除非希望能够控制对象的创建。

__new__至少要有一个参数cls,代表要实例化的类对象,此参数在实例化时由Python解释器自动提供,类似于self参数。

__new__必须要有返回值,返回实例化出来的实例(用于传入__init__进行其他的初始化操作),这点在用户重新实现__new__时要特别注意。可以return父类__new__出来的实例,或者直接是object的__new__出来的实例(即通过return父类的__new__方法来返回父类的实例),也可以return任一新式类的__new__方法,但此时应注意不能用类自身的__new__方法或cls.__new__,以免发生死循环。

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

__new__与__init__:

__new__是在__init__之前被调用的特殊方法。__init__有一个参数self,用于让解释器传入__new__方法返回的实例。__init__在__new__的基础上可以完成一些其它的初始化动作,主要是作为构造函数,将以“类名(输入参数)”的形式传入的参数,传给__new__返回的实例进行初始化。注意,__init__不需要返回值。

若__new__没有正确返回当前类cls的实例(一个类型对象),解释器将不会调用__init__方法,即使是父类的实例也不行。如果__new__()返回其他类(新式类或经典类均可)的实例,那么只会调用被返回的那个实例所属类的__init__()方法。

简言之,在新式类中__new__()才是真正的实例化方法,为类提供外壳制造出实例框架,然后调用该框架内的构造方法__init__()使其丰满。

__new__()方法的特性:

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

猜你喜欢

转载自blog.csdn.net/sujingclg/article/details/81417254