1. #-*- encoding=utf-8 -*-
  2. print '----------------------方法1--------------------------'
  3. #方法1,实现__new__方法
  4. #并在将一个类的实例绑定到类变量_instance上,
  5. #如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
  6. #如果cls._instance不为None,直接返回cls._instance
  7. class Singleton(object):
  8. def __new__(cls, *args, **kw):
  9. if not hasattr(cls, '_instance'):
  10. orig = super(Singleton, cls)
  11. cls._instance = orig.__new__(cls, *args, **kw)
  12. return cls._instance
  13. class MyClass(Singleton):
  14. a = 1
  15. one = MyClass()
  16. two = MyClass()
  17. two.a = 3
  18. print one.a
  19. #3
  20. #one和two完全相同,可以用id(), ==, is检测
  21. print id(one)
  22. #29097904
  23. print id(two)
  24. #29097904
  25. print one == two
  26. #True
  27. print one is two
  28. #True
  29. print '----------------------方法2--------------------------'
  30. #方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
  31. #同一个类的所有实例天然拥有相同的行为(方法),
  32. #只需要保证同一个类的所有实例具有相同的状态(属性)即可
  33. #所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)
  34. #可参看:http://code.activestate.com/recipes/66531/
  35. class Borg(object):
  36. _state = {}
  37. def __new__(cls, *args, **kw):
  38. ob = super(Borg, cls).__new__(cls, *args, **kw)
  39. ob.__dict__ = cls._state
  40. return ob
  41. class MyClass2(Borg):
  42. a = 1
  43. one = MyClass2()
  44. two = MyClass2()
  45. #one和two是两个不同的对象,id, ==, is对比结果可看出
  46. two.a = 3
  47. print one.a
  48. #3
  49. print id(one)
  50. #28873680
  51. print id(two)
  52. #28873712
  53. print one == two
  54. #False
  55. print one is two
  56. #False
  57. #但是one和two具有相同的(同一个__dict__属性),见:
  58. print id(one.__dict__)
  59. #30104000
  60. print id(two.__dict__)
  61. #30104000
  62. print '----------------------方法3--------------------------'
  63. #方法3:本质上是方法1的升级(或者说高级)版
  64. #使用__metaclass__(元类)的高级python用法
  65. class Singleton2(type):
  66. def __init__(cls, name, bases, dict):
  67. super(Singleton2, cls).__init__(name, bases, dict)
  68. cls._instance = None
  69. def __call__(cls, *args, **kw):
  70. if cls._instance is None:
  71. cls._instance = super(Singleton2, cls).__call__(*args, **kw)
  72. return cls._instance
  73. class MyClass3(object):
  74. __metaclass__ = Singleton2
  75. one = MyClass3()
  76. two = MyClass3()
  77. two.a = 3
  78. print one.a
  79. #3
  80. print id(one)
  81. #31495472
  82. print id(two)
  83. #31495472
  84. print one == two
  85. #True
  86. print one is two
  87. #True
  88. print '----------------------方法4--------------------------'
  89. #方法4:也是方法1的升级(高级)版本,
  90. #使用装饰器(decorator),
  91. #这是一种更pythonic,更elegant的方法,
  92. #单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
  93. def singleton(cls):
  94. instances = {}
  95. def _singleton(, *args, **kw):
  96. if cls not in instances:
  97. instances[cls] = cls(*args, **kw)
  98. return instances[cls]
  99. return _singleton
  100. @singleton
  101. class MyClass4(object):
  102. a = 1
  103. def __init__(self, x=0):
  104. self.x = x
  105. one = MyClass4()
  106. two = MyClass4()
  107. two.a = 3
  108. print one.a
  109. #3
  110. print id(one)
  111. #29660784
  112. print id(two)
  113. #29660784
  114. print one == two
  115. #True
  116. print one is two
  117. #True
  118. one.x = 1
  119. print one.x
  120. #1
  121. print two.x
  122. #1

Python单例模式的4种实现方法的更多相关文章

  1. python单例模式的几种实现方法

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  2. python 单例模式的四种实现方法及注意事项

    一.模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码. #foo1.py clas ...

  3. Python 单例模式的几种实现方式

    单例模式的几种实现方式 先来看几个魔法方法的简单运用:__new__, __init__, __call__. class A(object): def __init__(self, x): prin ...

  4. Python队列的三种队列方法

    今天讲一下队列,用到一个python自带的库,queue 队列的三种方法有: 1.FIFO先入先出队列(Queue) 2.LIFO后入先出队列(LifoQueue) 3.优先级队列(PriorityQ ...

  5. Python单例模式的四种方法

    在这之前,先了解super()和__new__()方法 super()方法: 返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法. 它有两个典型作用: a. 在单继承的类层次结构中, ...

  6. python 单例模式的四种创建方式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  7. python之asyncio三种应用方法

    1.直接使用asyncio.run方法2.同步的效果,用await调用函数3.创建任务(asyncio.create_task),并发运行任务(await asyncio.gather) import ...

  8. Python 单例模式(3种方式)

    方式一: # 单例模式: # 实现目的:实例化多次,得到的实例是同一个,就是同一个对象,同一个名称空间(更加节省空间) ####################################方式一: ...

  9. Python 模拟登录几种常见方法

    方法一:直接使用已知的cookie访问 优点: 简单,但需要先在浏览器登录 原理: 简单地说,cookie保存在发起请求的客户端中,服务器利用cookie来区分不同的客户端.因为http是一种无状态的 ...

随机推荐

  1. 几个css问题

    1.中文.英文和数字的表现方式不一样. 中文可以自动换行,英文和数字并不会自动换行,设置强制换行显示.word-wrap:break-word; 2.textarea中输入文字多的情况下,和邻边的in ...

  2. 大数开根号java模板

    利用逼近的思路直接二分开方找出值 package lanqiao; import java.math.BigInteger; import java.util.Scanner; public clas ...

  3. python3:jsonpath-rw处理Json对象

    前提:接口自动化测试中,存在依赖情况:test_02的某个请求参数的值,需要依赖test_01返回结果中某个字段的数据,所以就先需要拿到返回数据中特定字段的值.这里使用到python中jsonpath ...

  4. UI基础:UITextField 分类: iOS学习-UI 2015-07-01 21:07 68人阅读 评论(0) 收藏

    UITextField 继承自UIControl,他是在UILabel基础上,对了文本的编辑.可以允许用户输入和编辑文本 UITextField的使用步骤 1.创建控件 UITextField *te ...

  5. HDU 1565

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 先进行二分图黑白染色,S到黑,白到T,黑到白,问题转化成了求最大权独立集,最大点权独立集=sum-最小点权 ...

  6. matplotlib 操作子图(subplot,axes)

    Matplotlib 中文用户指南 3.3 使用 GridSpec 自定义子图位置 ax:matplotlib.axes._subplots.AxesSubplot,的基本操作 ax.set_xtic ...

  7. OpenCV 图像旋转实现

    1 旋转矩形 首先建议阅读图像旋转算法原理-旋转矩阵,这篇博客可以让你很好地理解图像中的每一个点是如何进行旋转操作的.其中涉及到了图像原点与笛卡尔坐标原点之间的相互转换以及点旋转的一些公式推导. 这里 ...

  8. POJ 3069:Saruman's Army

    Saruman's Army Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13242   Accepted: 6636 D ...

  9. Vquery PHP 简单爬虫类

    http://www.thinkphp.cn/topic/36693.html 在使用php进行网页抓取的时候你有没有感觉到用起来比较麻烦呢?目前我还没有发现php有这样针对网页抓取的类,每次用到这个 ...

  10. php脚本输出js代码不执行的解决办法和原理。

    <?phpecho "<script>alert('我弹出来了')</script>";?> 很简单你一句话就可以在PHP里面输出JS脚本让浏览 ...