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的Django框架完成视频处理任务的教程
Apr 02 Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 Python
Python 基础教程之str和repr的详解
Aug 20 Python
mac系统安装Python3初体验
Jan 02 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
python处理“
Jun 10 Python
Python类继承和多态原理解析
Feb 05 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 Python
python 实现弹球游戏的示例代码
Nov 17 Python
python基础之while循环语句的使用
Apr 20 Python
python pygame入门教程
Jun 01 Python
python通过opencv调用摄像头操作实例分析
Jun 07 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/09/30 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
Javascript 类与静态类的实现
2010/04/01 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
js DOM的学习笔记
2011/12/22 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python读取网页内容的方法
2015/07/30 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
python找出因数与质因数的方法
2019/07/25 Python
python中如何设置代码自动提示
2020/07/15 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
婚礼新郎父母答谢词
2014/01/16 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
优秀大学生自荐信
2014/06/09 职场文书
国庆节活动总结
2014/08/26 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
导游词之井冈山
2019/11/20 职场文书
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
php去除deprecated的实例方法
2021/11/17 PHP
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技