python singleton 4种单例
2024-09-02 14:22:02
def singleton(cls, *args, **kwargs):
instances = {}
def inner(cls, *args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return inner
@singleton
class Test1:
pass
# 推荐使用这种 简单好用 线程安全
# ===========================================================
import threading
class Singleton:
def __init__(self, cls):
self.__cls = cls
self.__instance = None
self._lock = threading.Lock()
def __call__(self, *args, **kwargs):
self._lock.acquire()
if self.__instance is None:
self.__instance = self.__cls(*args, **kwargs)
self._lock.release()
return self.__instance
@Singleton
class Test2:
pass
# 继承时的执行顺序 base new -> son new -> son init. new 相当于构造方法,init相当于实例后再初始化 先执行父类的new 就好比先是人再是学生
# ==============================================================
class SingleBase(object):
instance = None
def __new__(cls, *args, **kwargs):
# if not instance:
# instance = cls.__new__(*args, **kwargs):
# return instance
if cls.instance is None:
cls.instance = object.__new__(cls)
return cls.instance
def __init__(self):
pass
class Test3(SingleBase):
def __init__(self, name):
self._name = name
def get_name(self):
return self._name
# meta 这个我还不是很懂
# =====================================================
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class Test4(metaclass=MetaSingleton):
def __init__(self):
pass
if __name__ == '__main__':
t1 = Test3('jwang')
t2 = Test3('hello')
print(id(t1))
print(id(t2))
print(t1.get_name())
print(t2.get_name())
test3 = Test4()
test4 = Test4()
print(id(test3) == id(test4))
最新文章
- Distributed2:Linked Server Login 添加和删除
- poj1664-放苹果(递归)
- 如何参与Linux内核开发(转)
- php-引号中出现$
- CentOS 中PHP开启 GD功能
- Oracle 10g AND Oracle 11g手工建库案例--Oracle 11g
- A very hard Aoshu problem(dfs或者数位)
- POJ-1182 食物链---并查集(附模板)
- win7系统IE浏览器主页被搜狗篡改问题的解决方法
- 077、跨主机使用Rex-Ray volume (2019-04-24 周三)
- 利用git 进行多人协作开发
- LINQ之路11:LINQ Operators之过滤(Filtering)
- angular2 pipe实现搜索结果中的搜索关键字高亮
- BZOJ.4817.[SDOI2017]树点涂色(LCT DFS序 线段树)
- 【socket-python应用】控制泓格ET-7044通信模块输入DI输出DO
- 四层协议给站点设置独享ip
- asp.net正则表达式
- python dict 和 json 互转
- 关于sencha touch 用phonegap打包后,docked悬停的组件被手机软键盘遮挡的解决方法
- Odoo8中“更多”下拉菜单选项指定后台执行代码