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中操作字符串之replace()方法的使用
May 19 Python
python字典基本操作实例分析
Jul 11 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
python实现可逆简单的加密算法
Mar 22 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
Apr 29 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 Python
tensorflow指定GPU与动态分配GPU memory设置
Feb 03 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 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
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
Javascript 作用域使用说明
2009/08/13 Javascript
jQuery toggle()设置CSS样式
2009/11/05 Javascript
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python字符串排序方法
2014/08/29 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
优秀老员工获奖感言
2014/02/15 职场文书
进口业务员岗位职责
2014/04/06 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
门店店长岗位职责
2015/04/14 职场文书
法定代表人资格证明书
2015/06/18 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS