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脚本来实现最简单的FTP下载的教程
May 04 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
Python动态导入模块的方法实例分析
Jun 28 Python
python实现随机漫步算法
Aug 27 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
python使用 zip 同时迭代多个序列示例
Jul 06 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
Python就将所有的英文单词首字母变成大写
Feb 12 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新手上路(四)
2006/10/09 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
php常用的url处理函数总结
2014/11/19 PHP
php 删除cookie方法详解
2014/12/01 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
Three.js基础部分学习
2017/01/08 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
python和ruby,我选谁?
2017/09/13 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
详解Python 切片语法
2019/06/10 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
销售经理工作失职检讨书
2014/10/24 职场文书
自我检讨书范文
2015/01/28 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
李强优秀员工观后感
2015/06/16 职场文书
python 网络编程要点总结
2021/06/18 Python