面向对象进阶-单例模式

2022-11-25  本文已影响0人  测试探索

类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次,就是单例模式


image.png
"""
通过类的__new__方法实现单例模式
"""
class MyClass():
    __instance = False

    def __new__(cls, *args, **kwargs):
        # 判断类是否实例化过对象
        if cls.__instance:
            # 如果有,则直接返回之前的对象
            print("if第一层逻辑:",cls.__instance)
            return cls.__instance
        else:
            # 如果没有则调用父类的方法,进行实例化,并保存
            obj = super().__new__(cls)
            print("obj",obj)
            cls.__instance = obj
            return cls.__instance

a1 = MyClass()
a2 = MyClass()
a3 = MyClass()
print(a1,a2,a3)

image.png

练习题

实现一个可以让类变成单例模式的装饰器,只要任意一个类使用该装饰器装饰,那么就会变成一个单例模式的类。

def single(cls):
    cls.instance = None
    def wrapper(*args, **kwargs):
        if not getattr(cls, 'instance'):
            cls.instance = cls(*args, **kwargs)

        return cls.instance
    return wrapper


@single  # DemoTest = single(DemoTest)
class DemoTest:
    pass


a1 = DemoTest()
a2 = DemoTest()
a3 = DemoTest()
print(a1, a2, a3)
image.png
上一篇下一篇

猜你喜欢

热点阅读