单例模式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
实现单例模式方法
1、import实现
思路:Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码
备注:test.py实现以下Single类,并初始化single为其实例
class Single():
def foo(self):
pass
single = Single()
备注:在test2.py中实现以下并执行,可以发现对象为同一个
from test import single
#to user
single1 = single.foo()
single2 = single.foo()
print(id(single1),id(single2))
#输出,可以发现对象是同一个
1613997264 1613997264
2、借助__new__
思路:实现__new__方法,然后将类的一个实例绑定到类变量_instance上;如果cls._instance为None,则说明该类还没有被实例化过,new一个该类的实例,并返回;如果cls._instance不为None,直接返回_instance
class Single():
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
obj = object.__new__(cls)#我们没写时,默认调用object.__new__
cls._instance = obj
return cls._instance
single1 = Single()
single2 = Single()
print(single1,single2)
#输出
<__main__.Single object at 0x0000022EDAF3AA58> <__main__.Single object at 0x0000022EDAF3AA58>
3、借助字典的setdefault()方法
思路:利用字典的setdefault()方法,如果第一次实例化就加入字典,以后每次都返回这个对象
def singleton(cls):
singleton_dict = {}
def close(*args, **kwargs):
# 利用字典的setdefault()方法
return singleton_dict.setdefault('obj',cls(*args, **kwargs))
return close
@singleton
class MyClass:
pass
if __name__ == '__main__':
foo1 = MyClass()
foo2 = MyClass()
print(foo1)
print(foo2)
#输出
<__main__.MyClass object at 0x0000014C6CEC87B8>
<__main__.MyClass object at 0x0000014C6CEC87B8>