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快速排序代码实例
Nov 21 Python
tensorflow中next_batch的具体使用
Feb 02 Python
浅谈Python中的zip()与*zip()函数详解
Feb 24 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
May 08 Python
Python正则表达式和元字符详解
Nov 29 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
python 错误处理 assert详解
Apr 20 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
Python中logging日志的四个等级和使用
Nov 17 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 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
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php连接mysql数据库代码
2009/03/10 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
两款万能的php分页类
2015/11/12 PHP
php导出生成word的方法
2015/12/25 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
php面向对象重点知识分享
2019/09/27 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
python实现图书管理系统
2018/03/12 Python
flask入门之表单的实现
2018/07/18 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
工作求职自荐信
2014/06/13 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
工程部岗位职责
2015/02/10 职场文书
英语辞职信范文
2015/02/28 职场文书
网络销售员岗位职责
2015/04/11 职场文书
工作后的感想
2015/08/07 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
浅谈MySQL中的六种日志
2022/03/23 MySQL