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正则表达式介绍
Aug 06 Python
python 动态获取当前运行的类名和函数名的方法
Apr 15 Python
Python单例模式实例分析
Jan 14 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
django允许外部访问的实例讲解
May 14 Python
Python动态导入模块的方法实例分析
Jun 28 Python
对python函数签名的方法详解
Jan 22 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
在Pandas中处理NaN值的方法
Jun 25 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 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
一个简单实现多条件查询的例子
2006/10/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
python入门教程 python入门神图一张
2018/03/05 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
EJB的角色和三个对象
2015/12/31 面试题
自荐信格式的六要素
2013/09/21 职场文书
社会公德演讲稿
2014/05/20 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
裁员通知
2015/04/25 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript