简单了解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 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
Python赋值语句后逗号的作用分析
Jun 08 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
对numpy中向量式三目运算符详解
Oct 31 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
Django组件cookie与session的具体使用
Jun 05 Python
Python实现代码统计工具
Sep 19 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
Python 爬取必应壁纸的实例讲解
Feb 24 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 Python
python读取并查看npz/npy文件数据以及数据显示方法
Apr 14 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
php5 mysql分页实例代码
2008/04/10 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
php字符串操作针对负值的判断分析
2016/07/28 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
python搭建微信公众平台
2016/02/09 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
python中列表和元组的区别
2017/12/18 Python
Python线程创建和终止实例代码
2018/01/20 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
django admin 添加自定义链接方式
2020/03/11 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
简单的命令查看安装的python版本号
2020/08/28 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
html5与css3小应用
2013/04/03 HTML / CSS
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
几个判断型的面试题
2012/07/03 面试题
三八节主持词
2014/03/17 职场文书
2014年班组工作总结
2014/11/20 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
javaScript Array api梳理
2021/03/31 Javascript
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
vue如何清除浏览器历史栈
2022/05/25 Vue.js