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代码真的很爽
Aug 26 Python
python解决Fedora解压zip时中文乱码的方法
Sep 18 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
python定时任务 sched模块用法实例
Nov 04 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
Feb 14 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
python 用struct模块解决黏包问题
Nov 07 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
flask框架中的cookie和session使用
Jan 31 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
15种PHP Encoder的比较
2007/04/17 PHP
关于PHP语言构造器介绍
2013/07/08 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
PHP四大安全策略
2014/03/12 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
PDO::getAttribute讲解
2019/01/28 PHP
JavaScript 三种创建对象的方法
2009/10/16 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
python 字典中取值的两种方法小结
2018/08/02 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
python图像和办公文档处理总结
2019/05/28 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
三星法国官方网站:Samsung法国
2019/10/31 全球购物
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
运动会稿件50字
2014/02/17 职场文书
乔迁之喜主持词
2014/03/27 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
同学毕业留言寄语
2015/02/27 职场文书
python如何获取网络数据
2021/04/11 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python