参考了其他的博客:http://ghostfromheaven.iteye.com/blog/1562618

#-*- encoding=utf-8 -*-
print '----------------------方法1--------------------------'
#方法1,实现__new__方法
#并在将一个类的实例绑定到类变量_instance上,
#如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
#如果cls._instance不为None,直接返回cls._instance
class Singleton(object):  def __new__(cls, *args, **kw):  if not hasattr(cls, '_instance'):  orig = super(Singleton, cls)  cls._instance = orig.__new__(cls, *args, **kw)  return cls._instance  class MyClass(Singleton):  a = 1  one = MyClass()
two = MyClass()  two.a = 3
print one.a
#3
#one和two完全相同,可以用id(), ==, is检测
print id(one)
#29097904
print id(two)
#29097904
print one == two
#True
print one is two
#True  print '----------------------方法2--------------------------'
#方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
#同一个类的所有实例天然拥有相同的行为(方法),
#只需要保证同一个类的所有实例具有相同的状态(属性)即可
#所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)
#可参看:http://code.activestate.com/recipes/66531/
class Borg(object):  _state = {}  def __new__(cls, *args, **kw):  ob = super(Borg, cls).__new__(cls, *args, **kw)  ob.__dict__ = cls._state  return ob  class MyClass2(Borg):  a = 1  one = MyClass2()
two = MyClass2()  #one和two是两个不同的对象,id, ==, is对比结果可看出
two.a = 3
print one.a
#3
print id(one)
#28873680
print id(two)
#28873712
print one == two
#False
print one is two
#False
#但是one和two具有相同的(同一个__dict__属性),见:
print id(one.__dict__)
#30104000
print id(two.__dict__)
#30104000  print '----------------------方法3--------------------------'
#方法3:本质上是方法1的升级(或者说高级)版
#使用__metaclass__(元类)的高级python用法
class Singleton2(type):  def __init__(cls, name, bases, dict):  super(Singleton2, cls).__init__(name, bases, dict)  cls._instance = None  def __call__(cls, *args, **kw):  if cls._instance is None:  cls._instance = super(Singleton2, cls).__call__(*args, **kw)  return cls._instance  class MyClass3(object):  __metaclass__ = Singleton2  one = MyClass3()
two = MyClass3()  two.a = 3
print one.a
#3
print id(one)
#31495472
print id(two)
#31495472
print one == two
#True
print one is two
#True  print '----------------------方法4--------------------------'
#方法4:也是方法1的升级(高级)版本,
#使用装饰器(decorator),
#这是一种更pythonic,更elegant的方法,
#单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
def singleton(cls, *args, **kw):  instances = {}  def _singleton():  if cls not in instances:  instances[cls] = cls(*args, **kw)  return instances[cls]  return _singleton  @singleton
class MyClass4(object):  a = 1  def __init__(self, x=0):  self.x = x  one = MyClass4()
two = MyClass4()  two.a = 3
print one.a
#3
print id(one)
#29660784
print id(two)
#29660784
print one == two
#True
print one is two
#True
one.x = 1
print one.x
#1
print two.x
#1

转载于:https://www.cnblogs.com/aomi/p/7267986.html

PYTHON设计模式学习(3):Singleton pattern相关推荐

  1. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  2. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  3. 设计模式 - 单例模式(Singleton Pattern)

    单例模式 介绍 模式:创建型 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点 解决:一个全局使用的类频繁地创建与销毁 场景: 唯一序列号 web中的计数器 I/O与数据库的连接 -- 实现 ...

  4. Java设计模式之单例模式(Singleton Pattern)

    **单例模式:用来创造独一无二的,只能有一个实例的对象设计模式.单例模式确保一个类只有一个实例,并提供一个全局访问点.**相比于全局变量(对对象的静态引用),单例模式可以延迟实例化,而且全局变量不能保 ...

  5. 设计模式学习之--Singleton(单例)模式

    1.Singleton单例模式,是一种责任型模式.这种模式,通过隐藏构造器和提供对创建对象的单个访问点,实现了将类的职责---创建一个担当着独一无二角色的对象(生产唯一实例),集中于类的单个实例中. ...

  6. javascript设计模式-单例模式(singleton pattern)

    为什么80%的码农都做不了架构师?>>>    最简单的单例模式 var mySingleton = {property1: "something",proper ...

  7. php 单例模式 构函数,PHP设计模式——单例模式(Singleton Pattern)

    单例模式又叫单元素模式.某些应用程序资源是独占的,因为有且只有一个此类型的资源.例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销, ...

  8. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  9. 设计模式学习笔记十:单例模式(Singleton Pattern)

    1.概述    单例模式(Singleton Pattern)又称单件模式,单例模式保证一个类仅有一个实例,并提供一个访问的他的全局访问点.通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你 ...

最新文章

  1. GitHub的MySQL高可用性实践
  2. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
  3. wxWidgets:wxDragImage 示例
  4. 上网课的心得体会1000字_上网课心得体会300字 上网课的心得体会
  5. 【OpenCV 例程200篇】54. OpenCV 实现图像二维卷积
  6. binarytreenode”使用 类 模板 需要 模板 参数列表_0基础掌握Django框架(7)Django模板介绍...
  7. 滴滴出行回应导航崩了;微信支付正式上线「向手机号转账」功能;Guns 6.0 发布 | 极客头条...
  8. 安装.net Framework 3.5 SP1非常慢的解决方案
  9. 大数据实效_新都区:运用“大数据”提升专项巡察实效
  10. dcs world f15c教学_DCS小百科,工控人必须知道的一些小知识
  11. Python高级配色 RGB
  12. lodop php 快递单_lodop打印控件打印申通快递单
  13. IKEv2的密钥计算方式
  14. Android JetPack架构篇,一个实战项目带你学懂JetPack
  15. 两分钟研究透idea中Git文件的颜色,绿红蓝白灰
  16. L2-3 清点代码库【STL】
  17. insmod与modprobe命令的区别及其相关命令
  18. EZBOOT kernel not found DOS返回EZBOOT错误
  19. RK平台之AI模型转换环境搭建
  20. 十二个“一”的文艺创作

热门文章

  1. 基于jQuery焦点图片新闻代码(JS+CSS)
  2. 转载 Socket与TCP/IP的关系 转(非常好的一篇文章!)
  3. 漫步最优化四十三——拟牛顿法
  4. 【C++】C++类的学习(三)——运算符重载与友元函数
  5. 去哪儿-14-vuex_localstorage
  6. Virtual.Lab模拟钢板冲击声
  7. python优化算法_python – 优化算法
  8. KMP算法的简单理解
  9. 机器视觉【基础】什么是机器视觉?
  10. 数据太多加滚动标题不动_音乐数据挖掘导引(四)