Python中的__new__()方法
1、__new__()至少要有一个参数cls,代表当前类,此参数在实例时由python解释器自动识别, 2、__new__()必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意, 可以 return父类new出来的实例,
如:return super().__new__(cls),或者直接return object.__new__(cls) 3、init有一个参数self,就是这个__new__()方法返回的实例,
可以完成一些其它初始化的动作,init不需要返回值(有返回值就会报错) 4、如果__new__()创建的是当前类的实例,会自动调用__init__()函数,
通过return语句里面调用的__new__(cls)函数的第一个参数是cls来保证是当前类实例,
如果是其他类的类名,那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__()函数,也不会调用其他类的__init__()函数。
如下示例:
class A(object): def __init__(self): print('这是init方法:',self) def __new__(cls, *args, **kwargs): print('这是cls类本身的ID:',id(cls)) print('这是new方法:',object.__new__(cls)) # print('这是new方法:',super().__new__(cls)) # 跟上面那句本质一样,都是调用父类的new方法 return object.__new__(cls) A() print('这是A类的ID:',id(A)) '''
输出结果如下:
这是cls类本身的ID: 2790056212288 这是new方法: <__main__.A object at 0x000002899CB281C0> 这是init方法: <__main__.A object at 0x000002899CB281C0> 这是A类的ID: 2790056212288 '''
示例具体图解如下:
通过new方法实现单例:
''' __new__实现 ---> 通过调用类方法实例化对象时,自动触发的__new__来实现单例 ''' class Aoo(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = object.__new__(cls) return cls._instance a1 = Aoo() a2 = Aoo() # print(a1 is a2) # True