简单了解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中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
python获取代码运行时间的实例代码
Jun 11 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
numpy数组之存取文件的实现示例
May 24 Python
python 提取文件指定列的方法示例
Aug 07 Python
使用Python生成200个激活码的实现方法
Nov 22 Python
Python判断三段线能否构成三角形的代码
Apr 12 Python
python继承threading.Thread实现有返回值的子类实例
May 02 Python
python 8种必备的gui库
Aug 27 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 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开发过程中常用函数收藏
2009/12/14 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
使用python进行拆分大文件的方法
2018/12/10 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
jupyter notebook 多行输出实例
2020/04/09 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
开工仪式主持词
2014/03/20 职场文书
小学运动会班级口号
2014/06/09 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
迎七一演讲稿
2014/09/12 职场文书
校友回访母校寄语
2015/02/26 职场文书
观看建国大业观后感
2015/06/01 职场文书