简单了解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读取csv文件示例(python操作csv)
Mar 11 Python
Python实现抓取网页并且解析的实例
Sep 20 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
Python使用pydub库对mp3与wav格式进行互转的方法
Jan 10 Python
Python中字符串List按照长度排序
Jul 01 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
python 使用cx-freeze打包程序的实现
Mar 14 Python
实例讲解Python 迭代器与生成器
Jul 08 Python
python获取百度热榜链接的实例方法
Aug 25 Python
Python Django路径配置实现过程解析
Nov 05 Python
Pytest中skip和skipif的具体使用方法
Jun 30 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合并数组+与array_merge的区别分析
2010/08/01 PHP
PHP页面中文乱码分析
2013/10/29 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
python分割和拼接字符串
2013/11/01 Python
Python多线程和队列操作实例
2015/06/21 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python编程之变量赋值操作实例分析
2017/07/24 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Windows下python3.7安装教程
2018/07/31 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
《满井游记》教学反思
2014/02/26 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
中华魂演讲稿
2014/05/13 职场文书
建材投资建议书
2014/05/16 职场文书
不错的求职信范文
2014/07/20 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
一文带你探究MySQL中的NULL
2021/11/11 MySQL