面向对象进阶-单例模式
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