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. PyTorch 数据集类 和 数据加载类 的一些尝试

    最近在学习PyTorch,  但是对里面的数据类和数据加载类比较迷糊,可能是封装的太好大部分情况下是不需要有什么自己的操作的,不过偶然遇到一些自己导入的数据时就会遇到一些问题,因此自己对此做了一些小实 ...

  2. CodeForces - 1097D:Makoto and a Blackboard (积性)

    Makoto has a big blackboard with a positive integer n written on it. He will perform the following a ...

  3. Immutable集合

    转自:https://blog.csdn.net/michaellufhl/article/details/6314333 大家都知道JDK提供了Collections.UnmodifiableLis ...

  4. JVM 加载class文件的原理

    PS:类的装载过程是ClassLoader,只有把类 加载 到 JVM后才能运行: PS:两种加载类的方式: 显示:new 隐式:class.forname() PS:动态的执行,用到谁,加载谁:

  5. ansible copy file

    ansible xxxip  -m copy -a 'src=/localdir/file  dest=/sss/xxx/basic_search/bin/'

  6. Linux下软件包安装

    编译dbus下载地址 :http://dbus.freedesktop.org/releases/dbus/tar zxvf dbus-1.10.0echo ac_cv_have_abstract_s ...

  7. 【转】每天一个linux命令(57):ss命令

    原文网址:http://www.cnblogs.com/peida/archive/2013/03/11/2953420.html ss是Socket Statistics的缩写.顾名思义,ss命令可 ...

  8. MapReduce-线性回归

    线性回归有是三个值很重要: 1. 斜率 2. 截距:x和y轴的交点值: 3. 显著性:数据偏离线性的程度,用以判断数据可以用线性表示的程度:拟合度   apache.commons.math3里面有一 ...

  9. golang panic的捕获

    panic发生时, 会导致进程挂掉.为了处理panic, 可以使用recover捕获,然后处理. 下面以下标引用越界问题为例进行说明. 正常情况下,代码中如果出现下标越界,会直接触发panic, 导致 ...

  10. 【linux】vim/vi常用指令

    0或者"Home”键:光标转移到此段的最前面字节处. $或者"End"键:光标转移到此段的最后面字节处. n<space>:光标向后移动n个字节. n< ...