通过new方法,实现单例模式设计

    1. class Singleton(object):
    2. __instance=None
    3. def __init__(self):
    4. pass
    5. def __new__(cls, note):
    6. if cls.__instance is None:
    7. print("新建实例", note)
    8. # 以下3个语句,赋值号右侧 的效果完全一样 super()使用时一般不加参数;如果要加,第一个应该是当前的类
    9. cls.__instance=super().__new__(cls)
    10. # Singleton.__instance=super(Singleton, cls).__new__(cls) # 注意,此处__new__不传cls外的其它参数 python3语法
    11. # Singleton.__instance=object.__new__(cls)
    12. print(cls == Singleton)
    13. return cls.__instance
    14. # 注意:如果父类中,new方法下的cls换成类名Singleton,会导致子类继承后,redis类创建实例时,Singleton.__instance就已经存在了(也就是说,没有创建新的redis实例,仍然是db实例)
    15. # 子类和父类,本质上是两个类,所以子类创建实例的时候 cls==Singleton 的结果是False;父类创建实例时,cls==Singleton 的结果才是True
    16. class MyDb(Singleton):
    17. def __init__(self, note):
    18. print('初始化', note)
    19. class MyRedis(Singleton):
    20. def __init__(self, note):
    21. print('初始化', note)
    22. db_one = MyDb('db____one')
    23. db_two = MyDb('db____two')
    24. redis_one = MyRedis("redis____one")
    25. redis_two = MyRedis("redis____two")
    26. print(id(db_one)) # 2565285375728
    27. print(id(db_two)) # 2565285375728
    28. print(db_one == db_two) # True
    29. print(db_one is db_two) # True
    30. print(id(redis_one)) # 2565285375728
    31. print(id(redis_two)) # 2565285375728
    32. print(redis_one == redis_two) # True
    33. print(redis_one is redis_two) # True

    执行结果
    image.png

    注意:
    创建新的实例对象时,python3语法 object.new() 只传cls
    image.png