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代码来绘制彭罗斯点阵的教程
Apr 03 Python
Python中的Matplotlib模块入门教程
Apr 15 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
Python 中迭代器与生成器实例详解
Mar 29 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
详解python metaclass(元类)
Aug 13 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 Python
python抢购软件/插件/脚本附完整源码
Mar 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 动态多文件上传
2009/01/18 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
Python开发编码规范
2006/09/08 Python
Python实现把数字转换成中文
2015/06/29 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
优秀生推荐信范文
2013/11/28 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
银行进社区活动总结
2014/07/07 职场文书
Python中re模块的元字符使用小结
2022/04/07 Python