简单了解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实现保证只能运行一个脚本实例
Jun 24 Python
python实现折半查找和归并排序算法
Apr 14 Python
Python常见工厂函数用法示例
Mar 21 Python
PyQT实现多窗口切换
Apr 20 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
python中的数据结构比较
May 13 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
pytorch 预训练层的使用方法
Aug 20 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
删除pycharm鼠标右键快捷键打开项目的操作
Jan 16 Python
python3读取文件指定行的三种方法
May 24 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的开合式多级菜单程序
2006/10/09 PHP
几种显示数据的方法的比较
2006/10/09 PHP
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
JQuery 操作/获取table具体代码
2013/06/13 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
python如何求100以内的素数
2020/05/27 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
高中的自我鉴定
2013/12/16 职场文书
公司培训心得体会
2014/01/03 职场文书
信息专业学生学习的自我评价
2014/02/17 职场文书
小学三年级学生评语
2014/04/22 职场文书
借款协议书范本
2014/04/22 职场文书
设计师求职信模板
2014/05/06 职场文书
植树节标语
2014/06/27 职场文书
课外活动总结范文
2014/07/09 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis