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函数返回多个值的示例方法
Dec 04 Python
python使用xmlrpc实例讲解
Dec 17 Python
用Python和MD5实现网站挂马检测程序
Mar 13 Python
python端口扫描系统实现方法
Nov 19 Python
python 基础教程之Map使用方法
Jan 17 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
Python 实现12306登录功能实例代码
Feb 09 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 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
mysql建立外键
2006/11/25 PHP
PHP 模板高级篇总结
2006/12/21 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
javascript 限制输入脚本大全
2009/11/03 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
element跨分页操作选择详解
2020/06/29 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
Python Web服务器Tornado使用小结
2014/05/06 Python
Python实现数据库并行读取和写入实例
2017/06/09 Python
更新修改后的Python模块方法
2019/03/03 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
Python socket服务常用操作代码实例
2020/06/22 Python
python 字符串格式化的示例
2020/09/21 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
介绍一下write命令
2012/09/24 面试题
毕业生就业推荐信范文
2013/12/01 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
市场开发计划书
2014/05/07 职场文书
乡镇党建工作汇报材料
2014/10/27 职场文书
施工员岗位职责
2015/02/10 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
排查MySQL生产环境索引没有效果
2022/04/11 MySQL