day22_单例模式
1、单例模式
属于创建类型的一种常用的软件设计模式。通过单例模式的方法,能够确保创建的类在当前进程中只有一个实例(多线程时需要另作分析)
2、实现单例模式的几种方式
2.1 模块
模块第一次被导入时,会被执行并生成.pyc
文件,第二次被导入,就会直接加载.pyc
文件,而不会被重复执行
因此,可以将相关的函数和数据定义在一个模块中,即可得到单例对象
2.2 装饰器
# 对象是由类实例化产生,因此装饰器的参数是类,即被装饰的是类
def Singleton(cls):
_instance = {} # 存放单例对象,以类名cls为key,cls的实例化对象为value
def wrapper(*args, **kwargs):
if cls not in _instance:
# 不存在类cls的单例对象,实例化一个类cls的对象
_instance[cls] = cls(*args, *kwargs)
else:
# 存在类cls的单例对象,不执行cls的实例化
pass
return _instance[cls] # 注意此处返回的是value,而不是整个_instance
return wrapper
@Singleton
class Foo:
def __init__(self, name):
self.name = name
foo1 = Foo('alex')
foo2 = Foo('tank')
foo3 = Foo('nick')
print(foo1.name)
print(foo2.name)
print(foo3.name)
'''
alex
alex
alex'''
2.3 使用类的绑定方法
使用类的数据属性值存放单例对象????????
class Singleton:
__instance
def __init(self,*args,**kwargs):
pass
@classmethod
def singleton(cls,*args,**kwargs):
if not cls.__instance:
self.__instance = cls(*args,**kwargs)
return cls.__instance
obj = Singleton.singleton()
2.4 基于__new__()
方法实现
class Foo:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance:
pass
else:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self,name,age):
self.name = name
self.age = age
foo1 = Foo('alex',18)
foo2 = Foo('tank',19)
print(foo1)
print(foo2)
'''
<__main__.Foo object at 0x000001757F197A48>
<__main__.Foo object at 0x000001757F197A48>'''