简单了解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修改Excel数据的实例代码
Nov 01 Python
Python中的MongoDB基本操作:连接、查询实例
Feb 13 Python
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
利用Python实现Windows定时关机功能
Mar 21 Python
使用python画社交网络图实例代码
Jul 10 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
Python类继承和多态原理解析
Feb 05 Python
Django Xadmin多对多字段过滤实例
Apr 07 Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
Apr 05 Python
Python办公自动化之Excel(中)
May 24 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
May 25 Python
python中pandas对多列进行分组统计的实现
Jun 18 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文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
Javascript事件实例详解
2013/11/06 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
学习python需要有编程基础吗
2020/06/02 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
办公室文书岗位职责
2013/12/16 职场文书
企业年检委托书范本
2014/10/14 职场文书
监考失职检讨书
2015/01/26 职场文书
八达岭长城导游词
2015/01/30 职场文书
预备党员入党感言
2015/08/01 职场文书
win10清理dns缓存
2022/04/19 数码科技