[python] view plaincopy
  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, *args, **kw):
  94. instances = {}
  95. def _singleton():
  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单例模式的4种实现方法_Python单例模式的4种实现

    模块在一个Python应用程序中只有一份,它本身就是单例的,将所需要的属性和方法,直接暴露在模块中的全局变量和方法,也可以实现单例. Python单例模式的4种实现 # !/usr/bin/env p ...

  2. python 单例模式的四种实现方法

    DAY 13. 单例设计 13.1 什么是单例设计 一个类每次实例化返回的都是同一个对象,这种设计模式叫做单例设计,这个类叫做单例类 13.2 实现单例设计的方法 13.2.1 重写__new__() ...

  3. Python单例模式的4种实现方法(转)

    2019独角兽企业重金招聘Python工程师标准>>> [python]  view plain copy #-*- encoding=utf-8 -*- print '------ ...

  4. python最简单单例模式_Python单例模式的4种实现方法 | 学步园

    Python单例模式的4种实现方法: 方法1: 实现__new__方法,并将一个类的实例绑定到类变量_instance上.如果cls._instace为None,说明该类还未实例化过,实例化该类,并返 ...

  5. python多线程有几种实现方法

    python多线程有几种实现方法,都是什么? 目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而thread ...

  6. Python单例模式中几种实现及优化方法

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

  7. python单例模式代码-5种Python单例模式的实现方式

    本文为大家分享了Python创建单例模式的5种常用方法,供大家参考,具体内容如下 所谓单例,是指一个类的实例从始至终只能被创建一次. 方法1: 如果想使得某个类从始至终最多只有一个实例,使用__new ...

  8. 单例模式的5种实现方法及优缺点

    单例模式是GoF23种设计模式中创建型模式的一种,也是所有设计模式中最简单的一种. 单例模式是用来保证系统中某个资源或对象全局唯一的一种模式,比如系统的线程池.日志收集器等.它保证了资源在系统中只有一 ...

  9. python文件的两种编译方法

    有时候,需要对python程序项目进行打包,即仅打包python文件编译后的pyc文件,就需要对python文件进行编译. 编译方法有两种: 1.写一个python简本,对所需编译的文件进行编译.(针 ...

最新文章

  1. 微软官方教程教你如何在Windows上做Python开发?
  2. axios get 某个参数是数组怎么传_Vue 中 Axios 的封装和 API 接口的管理
  3. gulp编译less简单demo
  4. 计算机基础八进制和十六进制试题,计算机基础知识考试试题
  5. 面试题:双重检验锁⽅式实现 单例模式
  6. 【网络安全工程师面试题】数据库存在的漏洞及渗透方法
  7. html浮动提示框,JavaScript浮动提示框Tooltip效果
  8. BottomNavigationView--基本使用总结
  9. ubuntu开机密码破解
  10. MacOS中的剪切快捷键
  11. **懒得给孩子讲故事怎么办**
  12. Laravel的env和config傻傻分不清?
  13. Seaweedfs的安装和使用--研究
  14. (1)从1开始写一个操作系统
  15. 关于皓月GOM登录器配置器批量生成详细说明
  16. 微信小程序面向个人开放-附超详尽申请教程
  17. 【2021最新版】《定时执行专家 5.2》软件使用手册
  18. win+G没反应,Xbox game bar按不出来
  19. 京东商城项目实战(1)------京东商城首页
  20. Java实现手机号码归属地

热门文章

  1. java 运行os文件路径_Java获取文件路径的几种方式
  2. python做一副54扑克牌发牌技巧_德州扑克讲堂:高级技巧 胜率之摊牌胜率的算法...
  3. swagger 动态设置版本号_如何快速玩转swagger
  4. Windows下使用net user命令管理账户
  5. 网络交换机3大常见故障问题
  6. [渝粤教育] 昆明理工大学 会计学 参考 资料
  7. 【渝粤教育】国家开放大学2018年秋季 0062-22T港台文学专题讲座 参考试题
  8. [渝粤教育] 西南科技大学 经济法概论 在线考试复习资料2021版(3)
  9. 【渝粤题库】国家开放大学2021春3897商务英语1题目
  10. 2021年春季学期期末统一考试 金融统计分析 试题(开卷)