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

 

posted @ 2022-10-07 23:29  _yessir  阅读(470)  评论(0编辑  收藏  举报