Python实现Singleton模式

本文阅读 2 分钟
首页 Python笔记 正文

单例模式,核心结构中只包含一个被称为单例类的特殊类,类的对象只能存在一个
三个要点: 某个类只有一个实例; 必须自行创建这个实例; 必须自行向整个系统提供这个实例

  1. '''
  2. 方法1: 实现__new__方法,然后将类的一个实例绑定到类变量_instance上
  3. 如果cls._instance为None, 说明该类没有被实例化过, new一个该类的实例,并返回
  4. 如果cls._instance不是None, 直接返回_instance
  5. '''
  6. class Singleton1(object):
  7. def __new__(cls, *args, **kwargs):
  8. if not hasattr(cls, '_instance'):
  9. orig = super(Singleton1, cls)
  10. cls._instance = orig.__new__(cls, *args, **kwargs)
  11. return cls._instance
  12. class Myclass(Singleton1):
  13. a = 1
  14. one = Myclass()
  15. two = Myclass()
  16. # one和two完全相同, 可以用id(), ==, is检测
  17. print(id(one))
  18. print(id(two))
  19. print(one == two) # True
  20. print(one is two) # True
  21. two.a = 3
  22. print(one.a) # 3
  23. '''
  24. 方法2:共享属性;所谓单例就是所有引用(实例、对象)拥有相同的的状态(属性)和行为(方法)
  25. 同一个类的所有实例天然拥有相同的行为(方法)
  26. 只需要保证一个类的所有实例具有相同的状态(属性)即可
  27. 所有实例共享属性的最简单方法就是__dict__属性指向(引用)同一个字典(dict)
  28. '''
  29. class Borg(object):
  30. _state = {}
  31. def __new__(cls, *args, **kwargs):
  32. ob = super(Borg, cls).__new__(cls, *args, **kwargs)
  33. ob.__dict__ = cls._state
  34. return ob
  35. class MyClass2(Borg):
  36. a = 1
  37. one = MyClass2()
  38. two = MyClass2()
  39. two.a = 3
  40. print(one.a)
  41. # one 和 two 是两个不同的对象,id,==,is对比结果可以看出
  42. print(id(one)) # 18410480
  43. print(id(two)) # 18410512
  44. print(one == two) # False
  45. print(one is two) # False
  46. # 但是one和two具有相同的(同一个)__dict__属性
  47. print(id(one.__dict__)) # 14194768
  48. print(id(two.__dict__)) # 14194768
  49. '''
  50. 方法3:装饰器版本decorator
  51. 这是一种更pythonic,更elegant的方法
  52. 单例类本身根本不知道自己是单例的,因为他自己的代码并不是单例的
  53. '''
  54. def singleton(cls, *args, **kwargs):
  55. instances = {}
  56. def getinstance():
  57. if cls not in instances:
  58. instances[cls] = cls(*args, **kwargs)
  59. return instances[cls]
  60. return getinstance
  61. @singleton
  62. class MyClass3(object):
  63. a = 1
  64. def __init__(self, x = 0):
  65. self.x = x
  66. one = MyClass3()
  67. two = MyClass3()
  68. two.a = 3
  69. print(one.a) # 3
  70. print(id(one)) # 8842576
  71. print(id(two)) # 8842576
  72. print(one == two) # True
  73. print(one is two) # True
  74. one.x = 1
  75. print(one.x) # 1
  76. print(two.x) # 1
  77. '''
  78. 方法4:import方法
  79. python中的模块module在程序中只被加载一次,本身就是单例的
  80. 可以直接写一个模块,将你需要的方法和属性,写在模块中当做函数和模块作用域的全局变量即可,根本不需要写类。
  81. '''
  82. # mysingleton.py
  83. # class My_Singleton(object):
  84. # def foo(self):
  85. # pass
  86. # my_singleton = My_Singleton()
  87. # to use
  88. from mysingleton import my_singleton
  89. my_singleton.foo()
解压密码: detechn或detechn.com

免责声明

本站所有资源出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。

本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户自行鉴别,做一个有主见和判断力的用户。

本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。

Python下使用正则表达式
« 上一篇 01-21
Python二维数组中的查找
下一篇 » 01-21

发表评论

惪特博客
  • 文章总数:
    18497 篇
  • 评论总数:
    53327 条
  • 标签总数:
    8873 个
  • 总浏览量:
    22763958 次
  • 最后更新:
    3月27日

最多点赞

随便看看

标签TAG