本文共 1233 字,大约阅读时间需要 4 分钟。
目录
特殊方法 __new__()用来创建一个实例,它至少有一个参数cls,代表当前类。默认情况下__new__()会创建当前类的实例,该方法也可以被重载,重载后也可以创建其他类的实例。
cls.__new__(cls, *args, **kwargs)
名称 | 含义 | 备注 |
cls | 当前类 | 类名,不可省略的参数。 |
*args | 位置参数 | 创建实例位置参数,调用可省略,声明方法时不可省略。 |
**kwargs | 关键字参数 | 创建实例位置参数,调用可省略,声明方法时不可省略。 |
__new__方法返回创建好的对象实例。
使用__new__方法创建实例:
class Fun(object): def __init__(self, fun): self.fun = fun def __new__(cls, *args, **kwargs): return object.__new__(Fun)if __name__ == '__main__': f = Fun.__new__(Fun) print(type(f))
输出:
__new__()方法只是创建实例,此时拿到的实例并不能正常使用。一个实例需要被__init__()方法初始化后才可以被正常使用。也就是说,正常场景下,我们生成一个类的实例,Python先调用该类的__new()__方法创建一个实例,然后再调用__init__()方法初始化该实例。__new()__方法存在于object方法中,通常情况下不需要被重载。
可以使用__new__方法创建出其它类的实例。在这种场景下,__new__方法创建后会调用对应类的__init__方法完成初始化:
class Fun(object): def __init__(self, fun): self.fun = fun def __new__(cls, *args, **kwargs): return Demo(*args, **kwargs)class Demo(object): def __init__(self, d): self.demo = dif __name__ == '__main__': f = Fun(1) print("type f:", type(f)) print("f.demo:", f.demo)
运行结果:
type f:f.demo: 1
可以看出,f不是Fun类的一个实例,而是Demo类的一个实例,拥有Demo类的字段。因为Fun类的__new__方法创建的是一个Demo类实例,而非Fun类本身。因此Fun.__new__方法在return后调用了Demo.__init__方法,以完成该实例的初始化。
转载地址:http://tdsoi.baihongyu.com/