__new__():创建类实例,__init__()之前被调用
WHO:是一种负责创建类实例的静态方法,无需使用 staticmethod 装饰器修饰
WHAT:该方法会优先 __init__() 初始化方法被调用
WHERE: 在元类编程里大量的使用,绝大部分是不需要重写new 这个函数\
HOW
1:类中没有创建__new__(), 为默认方法存在
def __new__(cls, *args, **kwargs):
return super().__new__(cls)
2:继承部分类,可以使用__new__()发放进行条件的筛选和执行相应的逻辑
class nonZero(int):
def __new__(cls,value):
return super().__new__(cls,value) if value != 0 else None
def __init__(self,skipped_value):
#此例中会跳过此方法
print("__init__()")
super().__init__()
print(type(nonZero(-12))) # 返回类实例,执行__init__()
print(type(nonZero(0))) # 返回None,不执行__init__()
3:要想执行__init__()方法,__new__()必须执行 return super().__new__(cls)
4:__init__(self) 中的 self代表对象, __new__(cls)中的cls代表一个类
self 是 cls return 的返回对象
5:__new__(cls, *args, **kwargs) 中如果有参数,必须在__init__(self,*args, **kwargs) 中定义,要不会报错