新闻动态

Python实现单例模式的5种方法

发布日期:2022-03-11 15:44 | 文章来源:源码之家

基本介绍

一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点。

单例模式应该是应用最广泛,实现最简单的一种创建型模式。

特点:全局唯一,允许更改

优缺点

优点:

  • 避免对资源的多重占用,如写入文件操作
  • 节省内存
  • 防止命名空间被污染

缺点:

  • 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

Python实现

方式1,元类实现:

class MetaClass(type):
 def __call__(self, *args, **kwargs):
  """
  self : class Singleton
  """
  if not hasattr(self, "ins"):
insObject = super(__class__, self).__call__(*args, **kwargs)
setattr(self, "ins", insObject)
  return getattr(self, "ins")

class Singleton(object, metaclass=MetaClass):
 pass

if __name__ == "__main__":
 ins = Singleton()
 print(id(ins))
 ins = Singleton()
 print(id(ins))

方式2,继承实现:

class ParentClass:
 def __new__(cls, *args, **kwargs) -> object:
  """
  cls : class Singeton
  """
  if not hasattr(cls, "ins"):
insObject = super(__class__, cls).__new__(cls, *args, **kwargs)
setattr(cls, "ins", insObject)
  return getattr(cls, "ins")

class Singleton(ParentClass):
 pass

if __name__ == "__main__":
 ins = Singleton()
 print(id(ins))
 ins = Singleton()
 print(id(ins))

方式3,装饰器实现:

def warpper(clsObject):
 def inner(*args, **kwargs):
  if not hasattr(clsObject, "ins"):
insObject = clsObject(*args, **kwargs)
setattr(clsObject, "ins", insObject)
  return getattr(clsObject, "ins")
 return inner

@warpper
class Singleton:
 pass

if __name__ == "__main__":
 ins = Singleton()
 print(id(ins))
 ins = Singleton()
 print(id(ins))

方式4,模块实现:

- foo.py --> ins = Singleton()
- bar.py --> from foo import ins

方式5,@classmethod实现单例模式:

class Singleton:
 @classmethod
 def getSingletonInstanceObject(cls, *args, **kwargs):
  if not hasattr(cls, "ins"):
insObject = cls(*args, **kwargs)
setattr(cls, "ins", insObject)
  return getattr(cls, "ins")

if __name__ == "__main__":
 ins = Singleton.getSingletonInstanceObject()
 print(id(ins))
 ins = Singleton.getSingletonInstanceObject()
 print(id(ins))

到此这篇关于Python实现单例模式的5种方法的文章就介绍到这了,更多相关Python 单例模式内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

海外稳定服务器

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部