简单了解python单例模式的几种写法


Posted in Python onJuly 01, 2019

方法一:使用装饰器

装饰器维护一个字典对象instances,缓存了所有单例类,只要单例不存在则创建,已经存在直接返回该实例对象。

def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class Foo(object):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2

方法二:使用基类

__new__是真正创建实例对象的方法,所以重写基类的__new__方法,以此来保证创建对象的时候只生成一个实例

class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Foo(Singleton):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

方法三:使用元类

元类(参考:深刻理解Python中的元类)是用于创建类对象的类,类对象创建实例对象时一定会调用__call__方法,因此在调用__call__时候保证始终只创建一个实例即可,type是python中的一个元类。

class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class Foo(object):
__metaclass__ = Singleton
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
python函数与方法的区别总结
Jun 23 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
May 22 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
解决Python字典查找报Keyerror的问题
May 26 Python
python如何获取列表中每个元素的下标位置
Jul 01 #Python
Django自定义用户登录认证示例代码
Jun 30 #Python
Python中栈、队列与优先级队列的实现方法
Jun 30 #Python
Python中请不要再用re.compile了
Jun 30 #Python
用python求一个数组的和与平均值的实现方法
Jun 29 #Python
Python:Numpy 求平均向量的实例
Jun 29 #Python
python 计算数据偏差和峰度的方法
Jun 29 #Python
You might like
codeigniter中测试通过的分页类示例
2014/04/17 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
浅谈js中的闭包
2015/03/16 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
JS实现手风琴特效
2020/11/08 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
Python编程中的文件操作攻略
2015/10/16 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
python -v 报错问题的解决方法
2020/09/15 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
印度购物网站:TATA CLiQ
2017/11/23 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
《最后的姿势》教学反思
2014/02/27 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
JavaScript文档对象模型DOM
2021/11/20 Javascript
OpenCV实现常见的四种图像几何变换
2022/04/01 Python