简单了解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基于正则表达式实现文件内容替换的方法
Aug 30 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
Scrapy框架使用的基本知识
Oct 21 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
python内置模块collections知识点总结
Dec 19 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
python关于倒排列的知识点总结
Oct 13 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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取整的几种方式
2013/06/25 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
Python base64编码解码实例
2015/06/21 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
python解析含有重复key的json方法
2019/01/22 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
美国创意之家:BulbHead
2017/07/12 全球购物
影视动画专业个人的自我评价
2013/12/31 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
九年级物理教学反思
2014/01/29 职场文书
小学教师节活动方案
2014/01/31 职场文书
趣味运动会活动方案
2014/02/12 职场文书
学校门卫岗位职责
2014/03/16 职场文书
最美家庭活动方案
2014/08/31 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
公司业务员管理制度
2015/08/05 职场文书