Python下singleton模式的实现方法


Posted in Python onJuly 16, 2014

很多开发人员在刚开始学Python 时,都考虑过像 c++ 那样来实现 singleton 模式,但后来会发现 c++ 是 c++,Python 是 Python,不能简单的进行模仿。

Python 中常见的方法是借助 global 变量,或者 class 变量来实现单件。本文就介绍以decorator来实现 singleton 模式的方法。示例代码如下:

##----------------------- code begin -----------------------

# -*- coding: utf-8 -*-
def singleton(cls):
"""Define a class with a singleton instance."""
instances = {}
def getinstance(*args, **kwds):
return instances.setdefault(cls, cls(*args, **kwds))
return getinstance
 
##1 未来版Python支持Class Decorator时可以这样用
class Foo(object):
def __init__(self, attr=1):
self.attr = attr

Foo = singleton( Foo ) ##2 2.5及之前版不支持Class Decorator时可以这样用

if __name__ == "__main__":
ins1 = Foo(2) # 等效于: ins1 = singleton(Foo)(2)
print "Foo(2) -> id(ins)=%d, ins.attr=%d, %s" % (id(ins1), ins1.attr, ('error', 'ok')[ins1.attr == 2])
ins2 = Foo(3)
print "Foo(3) -> id(ins)=%d, ins.attr=%d, %s" % (id(ins2), ins2.attr, ('error', 'ok')[ins2.attr == 2])
ins2.attr = 5
print "ins.attr=5 -> ins.attr=%d, %s" % (ins2.attr, ('error', 'ok')[ins2.attr == 5])
 
##------------------------ code end ------------------------

输出:

Foo(2) -> id(ins)=19295376, ins.attr=2, ok
Foo(3) -> id(ins)=19295376, ins.attr=2, ok
ins.attr=5 -> ins.attr=5, ok
Python 相关文章推荐
Python中用Decorator来简化元编程的教程
Apr 13 Python
使用python加密自己的密码
Aug 04 Python
python生成器表达式和列表解析
Mar 10 Python
Python 中的Selenium异常处理实例代码
May 03 Python
python的中异常处理机制
Aug 30 Python
Python闭包和装饰器用法实例详解
May 22 Python
python打包成so文件过程解析
Sep 28 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
通过实例解析python描述符原理作用
Jan 22 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
python的迭代器与生成器实例详解
Jul 16 #Python
Python的内存泄漏及gc模块的使用分析
Jul 16 #Python
Python的垃圾回收机制深入分析
Jul 16 #Python
python中将字典转换成其json字符串
Jul 16 #Python
记录Django开发心得
Jul 16 #Python
Python实现动态添加类的属性或成员函数的解决方法
Jul 16 #Python
Python重新引入被覆盖的自带function
Jul 16 #Python
You might like
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
vue2.x数组劫持原理的实现
2020/04/19 Javascript
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
Python中zip()函数用法实例教程
2014/07/31 Python
Python实现从URL地址提取文件名的方法
2015/05/15 Python
pytorch之添加BN的实现
2020/01/06 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
采购内勤岗位职责
2013/12/10 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
少先队活动总结
2014/08/29 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
公司股份转让协议书范本
2015/01/28 职场文书