简单了解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使用smtplib模块发送电子邮件的流程详解
Jun 27 Python
利用Python爬取可用的代理IP
Aug 18 Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
简单了解Django ContentType内置组件
Jul 23 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
python数据分析:关键字提取方式
Feb 24 Python
python之生成多层json结构的实现
Feb 27 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
Python常用扩展插件使用教程解析
Nov 02 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
对象析构函数__del__在Python中何时使用
Mar 22 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
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
js 字符串操作函数
2009/07/25 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
Python处理字符串之isspace()方法的使用
2015/05/19 Python
numpy排序与集合运算用法示例
2017/12/15 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
斯福泰克软件测试面试题
2015/02/16 面试题
材料加工硕士生求职信
2013/10/10 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
同学会主持词
2014/03/18 职场文书
2014年售票员工作总结
2014/11/19 职场文书
员工辞职信怎么写
2015/02/27 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
一般纳税人申请报告
2015/05/18 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
Go获取两个时区的时间差
2022/04/20 Golang
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android