为什么要实现单例模式
- 节省内存
实现的思路
- new
- 装饰器
- 模块引用
- 元类
实现思路
new方式
class SingleTon:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = super().__new__(cls)
return super(SingleTon, cls).__new__(cls)
def __init__(self, name):
self.name = name
- 优 好象优势也不是那么明显
- 劣 重写了new
装饰器
def singleton(cls, *args, **kwargs):
_instance = {}
def _singleton():
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance
return _singleton
import time
@singleton
class Test:
def __init__(self):
time.sleep(0.1)
print("23")
for i in range(10):
t = Test()
print(t.name)
优: 灵活
劣:把类的属性变成一个方法返回
模块引用
其实Python的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
元类
class SingleClass:
def __new__(cls, *args, **kwargs):
if hasattr(cls, "_instance"):
cls._instance = super().__new__(cls)
return super(SingleClass, cls).__new__(cls)
class Class_1:
__metaclass__ = SingleClass
def __init__(self):
print("re")
for i in range(12):
print(Class_1())
参考:
https://mp.weixin.qq.com/s/9Jy0nEb1VHYmzhIeBxIx1A
https://www.jianshu.com/p/cddbf26261e3