简单了解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时间模块中的datetime模块
Jan 13 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
Feb 17 Python
Python开发的实用计算器完整实例
May 10 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
python3模块smtplib实现发送邮件功能
May 22 Python
通过Pandas读取大文件的实例
Jun 07 Python
python爬虫超时的处理的实例
Dec 19 Python
Python实现word2Vec model过程解析
Dec 16 Python
Python使用type动态创建类操作示例
Feb 29 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
python实现AdaBoost算法的示例
Oct 03 Python
pymysql模块使用简介与示例
Nov 17 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中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
Python中qutip用法示例详解
2020/10/02 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
HTML5新增的Css选择器、伪类介绍
2013/08/07 HTML / CSS
法国珠宝店:CLEOR
2017/01/29 全球购物
会计职业生涯规划范文
2014/01/04 职场文书
2014年医务科工作总结
2014/12/18 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
小学三年级作文之写景
2019/11/05 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
Golang jwt身份认证
2022/04/20 Golang