博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python单例模式的4种实现方法 分类: python学习 ...
阅读量:6196 次
发布时间:2019-06-21

本文共 3532 字,大约阅读时间需要 11 分钟。

来源:http://blog.csdn.net/ghostfromheaven/article/details/7671853

#-*- 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/heybob/p/4718900.html

你可能感兴趣的文章
将String转化成Stream,将Stream转换成String
查看>>
POJ-1011 Sticks
查看>>
swat主流域文件(file.cio)参数详解——引自http://blog.sciencenet.cn/blog-922140-710636.html...
查看>>
支付宝接口错误:您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8
查看>>
娱乐一下:汤姆君的大转盘算法(搞笑版)
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句...
查看>>
[译] 为用户提供安全可靠的体验
查看>>
卷积神经网络—基本部件(2)
查看>>
Android 系统开发_四大组件篇 -- 探讨 Activity 的生命周期
查看>>
各个大厂裁员情况,已经慌的一B
查看>>
php.类与对象
查看>>
想入门数据科学领域?明确方向更重要
查看>>
【速记】借助ES6的模版字符串,在不用Babel插件的情况下实现一个轻量级类JSX功能...
查看>>
PHP算法之四大基础算法
查看>>
JavaScript常用数组操作方法,包含ES6方法
查看>>
从0开始用python写一个命令行小游戏(六)
查看>>
「Do.003」 adb无线连接Android设备
查看>>
Canvas 核心技术
查看>>
Nginx 部署静态页面
查看>>