简单了解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的设计模式编程入门指南
Apr 02 Python
Python 实现数据库更新脚本的生成方法
Jul 09 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
详解python while 函数及while和for的区别
Sep 07 Python
python numpy元素的区间查找方法
Nov 14 Python
python启动应用程序和终止应用程序的方法
Jun 28 Python
python读写csv文件方法详细总结
Jul 05 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
python 字符串常用函数详解
Sep 11 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
python实现学生信息管理系统(精简版)
Nov 27 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 addAttribute()函数讲解
2019/02/03 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[31:29]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第一场 12.20
2020/12/23 DOTA
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
对python中各个response的使用说明
2020/03/28 Python
Python decimal模块使用方法详解
2020/06/08 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
办公室前台岗位职责
2014/01/04 职场文书
营销团队口号
2014/06/06 职场文书
Python实现学生管理系统(面向对象版)
2021/06/24 Python
Tomcat配置访问日志和线程数
2022/05/06 Servers