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的垃圾回收机制深入分析
Jul 16 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
用Eclipse写python程序
Feb 10 Python
python解析json串与正则匹配对比方法
Dec 20 Python
Pycharm 设置默认头的图文教程
Jan 17 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
python实现滑雪者小游戏
Feb 22 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
python的launcher用法知识点总结
Aug 07 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
整理Python中常用的conda命令操作
Jun 15 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 三维饼图的实现代码
2008/09/28 PHP
PHP 七大优势分析
2009/06/23 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
js实现本地图片文件拖拽效果
2017/07/18 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
python每隔N秒运行指定函数的方法
2015/03/16 Python
使用python实现接口的方法
2017/07/07 Python
python实现windows壁纸定期更换功能
2019/01/21 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
含预算的公司户外活动方案
2014/08/16 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
新闻报道稿范文
2015/07/23 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js
Golang ort 中的sortInts 方法
2022/04/24 Golang
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android