目录
描述
特殊方法 __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))
输出:
<class '__main__.Fun'>
注意事项
__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 = d
if __name__ == '__main__':
f = Fun(1)
print("type f:", type(f))
print("f.demo:", f.demo)
运行结果:
type f: <class '__main__.Demo'>
f.demo: 1
可以看出,f不是Fun类的一个实例,而是Demo类的一个实例,拥有Demo类的字段。因为Fun类的__new__方法创建的是一个Demo类实例,而非Fun类本身。因此Fun.__new__方法在return后调用了Demo.__init__方法,以完成该实例的初始化。