__new__(cls)方法
__new__(cls)必须要有一个参数cls,代表着要实例化的类,而且必须要有返回值,返回实例化出来的实例对象.
__new__(cls)和__init__(self)的区别:
__init__(self)有一个参数self,就是这个__new__(cls)返回来的实例,__init__(self)可以再__new__(cls)的基础上进行其他一些初始化的操作,而且不需要返回值。
__new__(cls)好比制造产品之前的原材料采购环节,而__init__(self)好比在买回来的原材料上进行加工的环节
来看一个例子:
class Dog:
def __new__(cls): # 这里传入的cls就是Dog这个类指向的类对象
print('new')
def __init__(self):
print('init')
dog = Dog() # new
print(dog) # None
在Python3中,class定义的时候,如果不显式的写继承object,也是会默认自动继承object的,所以也会有__new__(cls)。
在上述例子中,为什么__init__(self)没有触发呢,是因为这个__new__(cls)就是创建对象的方法,一般就是通过object.__new__(cls)来进行实例化的,但是我们在Dog这个类里面把这个方法又重写了,重写的这个__new__(cls)方法并没有真正的创建一个对象(即没有返回实例化的实例对象),所以上面例子没有触发__init__(self)
那么来改成上面的例子: