"""
单例模式 单利模式是一种设计模式, 应用该模式的类只会生成一个实例, 可以保证在程序的不同位置
都可以且仅可以取到同一个对象实例. 如果实例不存在, 会创建一个实例, 但是如果已经存在就会返回这个实例. 四种实现方法:
1.函数装饰器实现单例模式
2.类装饰器实现单例模式
3.__new__实现单例模式
4.metaclass实现单利模式
""" # 1.函数装饰器实现单例模式 def singleton(cls):
_instance = {} def get_instance():
# 实例不存在创建实例
if cls not in _instance:
_instance[cls] = cls() # 实例存在直接返回
return _instance[cls] return get_instance @singleton
class Cls(object):
def __init__(self):
pass cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2)) # True # 2.类装饰器实现单例模式 class Singleton(object):
def __init__(self, cls):
self.cls = cls
self._instance = {} def __call__(self):
if self.cls not in self._instance:
self._instance[self.cls] = self.cls() return self._instance[self.cls] @Singleton
class Cls2(object):
def __init__(self):
pass cls3 = Cls2()
cls4 = Cls2()
print(id(cls3) == id(cls4)) # True # 3.__new__实现单例模式, 在创建实例的时候进行干预 class Singleton2(object):
_instance = None def __new__(cls, *args, **kwargs): # 实例不存在创建实例
if cls._instance is None:
cls._instance = super().__new__(cls, *args, **kwargs) # 实例存在直接返回
return cls._instance def __init__(self):
pass single1 = Singleton2()
single2 = Singleton2()
print(single1 == single2) # True # 4.metaclass实现单利模式, 元类metaclass可以通过方法__metaclass__创造类 class Singleton3(type):
_instance = {} def __call__(cls, *args, **kwargs): if cls not in cls._instance:
cls._instance[cls] = super().__call__(*args, **kwargs) return cls._instance[cls] class Cls3(metaclass=Singleton3):
pass cls5 = Cls3()
cls6 = Cls3()
print(id(cls5) == id(cls6)) # True

最新文章

  1. AMD与CMD(转载)
  2. PHP加速处理插件 Zend Optimizer,Zend Guard Loader 和 Zend Opcache 区别
  3. StringUtils中 isEmpty 和isBlank的区别
  4. 如何在android项目中引用project作为类库引用
  5. bzoj 3223/tyvj 1729 文艺平衡树 splay tree
  6. Android开发之使用广播监听网络状态变化
  7. 【转】内核编译时, 到底用make clean, make mrproper还是make distclean(转载)
  8. Singleton Pattern(单例模式)
  9. mysql之其他
  10. bzoj 5297: [Cqoi2018]社交网络
  11. 【python标准库模块一】时间模块time学习
  12. HTTPS和TCP协议三次握手设计
  13. 增加swap分区
  14. 浅谈BFC的理解
  15. 使用readAsDataURL方法预览图片
  16. Caffe-SSD相关源码说明和调试记录
  17. Sublime Text 3(中文)在Windows下的配置、安装、运行
  18. sqlserver 查看当前连接数
  19. Java的Integer和int有什么区别
  20. 深入理解HTTP协议之POST方法——ajax实例

热门文章

  1. CPU是海王?聊聊 主/子线程 和 同/异步 的关系
  2. 最小生成树MST算法(Prim、Kruskal)
  3. fashion_mnist 计算准确率、召回率、F1值
  4. Termux镜像在阿里云镜像站首发上线
  5. # Redhat7 安装 yum源
  6. kernel热补丁
  7. RDMA--libibverbs代码分析(2)-设备发现
  8. 一个故事看懂CPU的SIMD技术
  9. 2022IDEA配置启动lilishop的swagger展示
  10. Zookeeper 文件系统 ?