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. Femtocell家庭基站通信截获、伪造任意短信漏洞

    阿里移动安全团队与中国泰尔实验室无线技术部的通信专家们一起,联合对国内运营商某型Femtocell基站进行了安全分析,发现多枚重大漏洞,可导致用户的短信.通话.数据流量被窃听.恶意攻击者可以在免费申领 ...

  2. [python] 基于词云的关键词提取:wordcloud的使用、源码分析、中文词云生成和代码重写

    1. 词云简介 词云,又称文字云.标签云,是对文本数据中出现频率较高的“关键词”在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思.常见于博客.微博 ...

  3. UNIMRCP 代码走读

    基于UNIMRCP1.5.0的代码走读 与 填坑记录 1. server启动配置加载 入口:unimrcp_server.c static apt_bool_t unimrcp_server_load ...

  4. Error: map 不是模板

    问题: 笔者在自定义的namespace中使用map的时候,出现如题所示的问题. Error: map 不是模板 解决 百思不得其解. 然后Google到一片CSDN博文的类似问题 vector不是模 ...

  5. 【opencv基础】imread-第二个参数

    问题1: 显示的是灰色的界面,不能正常显示图像. 解决方法:在imshow之后加上waitKey即可.原因here: Note:This function should be followed by ...

  6. 《DSP using MATLAB》Problem 3.21

    模拟信号经过不同的采样率进行采样后,得到不同的数字角频率,如下: 三种Fs,采样后的信号的谱 重建模拟信号,这里只显示由第1种Fs=0.01采样后序列进行重建,采用zoh.foh和spline三种方法 ...

  7. <ul><li>

    ☆ <ul><li> 1. li是不能单独使用,必须在于ul之中的. 2. ul是块级元素,能直接定义宽高,而li是行级元素,不能直接定义 高. 3. li组 只能写在ul之中 ...

  8. JSON字符串-赋张最初接触后台从map转json的方法

    **************************************** json数组: *************************************************** ...

  9. XDomainRequest object

    The XDomainRequest object has these types of members: Events Methods Properties Events The XDomainRe ...

  10. 整理开源协议问题 GPL APACHE

    整理开源协议问题 GPL APACHE APACHE 和 GPL 互相不兼容. APACHE 不可以使用 GPL 的代码. 但是 APACHE 可以调用 GPL 组件的接口. 比如 Linux 和 A ...