__new__魔术方法的功能是创建对象,至少有一个参数cls
__new__触发时机快于__init__,因为先创建对象,再去初始化对象,所以__new__快于__init__
new方法参数要和init方法参数一一对应,可以使用*args和**kwargs接受参数
当一个类里定义了一个__new__魔术方法,系统就不给你自动实例化对象,需要你自己手动创建对象,要借助父类object.__new__(cls)
如果__new__方法里什么都不写,默认返回的是一个None,实例化对象出来的也是一个None.
如果new方法返回不是本类对象,不会触发本类init构造方法
那么问题来了,__new__魔术方法有什么用呢,我不写系统自动不就给我创建该类的对象了吗,其实它作用是还可以返回其他类的对象,例如:
```
class MyClass():
a = 1
other_obj = MyClass()
class Boat():
def __new__(cls, *args, **kwargs):
return other_obj
def __init__(self):
print(‘你好‘)
obj = Boat()
print(obj.a)
# 打印结果 1
```
总结 : 因为new方法调用的不是本类对象,所以本类init方法不执行,所以也就能打印其他类的属性a