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 相关文章推荐
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
Python中列表和元组的使用方法和区别详解
Dec 30 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
Python实现k-means算法
Feb 23 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
浅谈Python 参数与变量
Jun 20 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
教你怎么用python selenium实现自动化测试
May 27 Python
利用python进行数据加载
Jun 20 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错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
Yii框架安装简明教程
2020/05/15 PHP
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
vuex实现数据状态持久化
2019/11/11 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
python向图片里添加文字
2019/11/26 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python数据类型强制转换实例详解
2020/06/22 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
七年级生物教学反思
2014/01/30 职场文书
2015年教师新年寄语
2014/12/08 职场文书
道德与公民自我评价
2015/03/09 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫