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中使用PIL模块处理图像的教程
Apr 29 Python
python文件操作之目录遍历实例分析
May 20 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
python处理数据,存进hive表的方法
Jul 04 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
django 外键创建注意事项说明
May 20 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
python制作抽奖程序代码详解
Jan 15 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
python三子棋游戏
May 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
基于文本的留言簿
2006/10/09 PHP
php中对2个数组相加的函数
2011/06/24 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
JavaScript中实现异步编程模式的4种方法
2014/09/24 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
js制作提示框插件
2020/12/24 Javascript
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
客服服务心得体会
2013/12/30 职场文书
企业员工培训感言
2014/02/26 职场文书
网页美工求职信范文
2014/04/17 职场文书
法语专业求职信
2014/07/20 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
农业生产宣传标语
2014/10/08 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA