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. Python int操作

    a = 1 # 1 print(a.bit_length()) #计算一个数字的二进制长度.没啥用

  2. happypack 进一步 优化 build速率

    1.webpack.base.conf.js 使用happypack的正确姿势: 'use strict' const path = require('path') const utils = req ...

  3. conan-transit服上的库列表

    conan-transit服上的库列表 因为获取列表比较慢,所以获取后在此记录,以备查找.conan-transit 是个只读库,不会有更新.新的库将上传到 conan-center. conan是C ...

  4. tiny4412 UART for C printf Demo

    /************************************************************************** * tiny4412 UART for C pr ...

  5. matlab与vs混合编程/matlab移植

    前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

  6. C#写的window服务内存溢出

    浅谈c#垃圾回收机制(GC) 写了一个window服务,循环更新sqlite记录,内存一点点稳步增长.三天后,内存溢出.于是,我从自己的代码入手,查找到底哪儿占用内存释放不掉,最终明确是调用servi ...

  7. oracle 11g 建库 建表 增 删 改 查 约束

    一.建库 1.(点击左上角带绿色+号的按钮) 2.(进入这个界面,passowrd为密码.填写完后点击下面一排的Test按钮进行测试,无异常就点击Connect) 二.建表 1-1. create t ...

  8. LG4455 【[CQOI2018]社交网络】

    分析 这题我们先转化为图论模型,发现求的其实就是有向图中以1为根的生成树数量.而关于这一问题存在O(3^n * n^2)的算法,一看数据n=250,发现不行.于是需要更高效的算法--Matrix-Tr ...

  9. test20180829

    试题限制均为128MB,1Sec 总分150. 试题一 A题 问题描述: 小A得到了一棵美丽的有根树.这棵树由n个节点以及n - 1条有向边构成,每条边都从父亲节点指向儿子节点,保证除了根节点以外的每 ...

  10. django中的FBV和CBV

    django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...