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常用内置模块之xml模块(详解)
May 23 Python
Python中利用xpath解析HTML的方法
May 14 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
python 三种方法实现对Excel表格的读写
Nov 19 Python
Django vue前后端分离整合过程解析
Nov 20 Python
python解析照片拍摄时间进行图片整理
Jul 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
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python实现115网盘自动下载的方法
2014/09/30 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
python 构造三维全零数组的方法
2018/11/12 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
python中自带的三个装饰器的实现
2019/11/08 Python
python的json包位置及用法总结
2020/06/21 Python
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
家居设计专业个人自荐信范文
2013/11/26 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
教师节促销活动方案
2014/02/14 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
通知函格式范文
2015/04/27 职场文书
李强为自己工作观后感
2015/06/11 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers