简单了解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网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
python编写简单爬虫资料汇总
Mar 22 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
windows下ipython的安装与使用详解
Oct 20 Python
Sanic框架流式传输操作示例
Jul 18 Python
python中join()方法介绍
Oct 11 Python
为什么Python中没有"a++"这种写法
Nov 27 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
python3 assert 断言的使用详解 (区别于python2)
Nov 27 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 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关联链接常用代码
2012/11/05 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
python使用正则表达式提取网页URL的方法
2015/05/26 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
Python 图片处理库exifread详解
2021/02/25 Python
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
文案策划求职信
2014/04/14 职场文书
书香家庭事迹材料
2014/05/09 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
逃课检讨书
2015/01/26 职场文书
党员发展大会主持词
2015/07/03 职场文书
研讨会致辞
2015/07/31 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript