python单例装饰器_python单例模式和装饰器
单例模式
使用模块
其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
将上面的代码保存在文件 mysingleton.py 中,然后这样使用:
from mysingleton import my_singleton
my_singleton.foo()
1
2
3
from mysingleton import my_singleton
my_singleton.foo()
使用 __new__
为了使类只能出现一个实例,我们可以使用 new 来控制实例的创建过程,代码如下:
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance。
执行情况如下:
>>> one = MyClass()
>>> two = MyClass()
>>> one == two
True
>>> one is two
True
>>> id(one), id(two)
(4303862608, 4303862608)
使用装饰器
我们知道,装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例,代码如下:
from functools import wraps
def singleton(cls):
instances = {}
@wraps(cls)
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass(object):
a = 1
from functools import wraps
在上面,我们定义了一个装饰器 singleton,它返回了一个内部函数 getinstance,该函数会判断某个类是否在字典 instances 中,如果不存在,则会将 cls 作为 key,cls(*args, **kw) 作为 value 存到 instances 中,否则,直接返回 instances[cls]。
使用 metaclass
元类(metaclass)可以控制类的创建过程,它主要做三件事:
拦截类的创建
修改类的定义
返回修改后的类
使用元类实现单例模式的代码如下:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
# Python2
class MyClass(object):
__metaclass__ = Singleton
# Python3
# class MyClass(metaclass=Singleton):
# pass
python单例装饰器_python单例模式和装饰器相关推荐
- python单例类命名_单例模式(java/python/c++)
序 最近接触到新项目,后端基于java开发.对于有c++/python开发经验,无java经验的小梅同学,开始了漫漫学习之旅,第一篇学习记录,从最简单的单例模式开始吧. 众所周知,单例模式的最明显的几 ...
- python grpc unary call错误_python的黑魔法-装饰器
python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...
- 单例设计模式 序列化破坏单例模式原理解析及解决方案?
单例设计模式 序列化破坏单例模式原理解析及解决方案? 序列化和反序列化 反射的破坏
- python单例_Python单例模式
所谓单例,是指一个类的实例从始至终只能被创建一次,,而且自行实例化并向整个系统提供这个实例. 方法1 如果想使得某个类从始至终最多只有一个实例,使用__new__方法会很简单.Python中类是通过_ ...
- python单例_python 单例模式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上
Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...
- python什么是装饰器_python学习之装饰器是什么?
学完python函数,接下来我们跟着猿人学python一起来看看什么是装饰器. 大家应该多多少少在其它地方有看过或是听过"装饰器"这个词.装饰器,顾名思义,就是用来装饰的,它装饰的 ...
- python单例设计模式(待补充)
要点概论: 1. 理解单例设计模式 2. 单例模式中的懒汉式实例化 3. 模块级别的单例模式 4. Monostate单例模式 5. 单例和元类 6.单例模式Ⅰ 7. 单例模式Ⅱ 8. 单例模式的缺点 ...
- Python单例设计模式
(1)为什么使用设计模式? 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. (2)单例设计模式概念 让类创建的对象只有唯一的一个实例,即每次执行 类名() 返回的对象,内存地 ...
- python ---单例(Singleton)
''' 单例(Singleton) 单例是一种 设计模式 ,应用该模式的类只会生成一个实例. 单例模式保证了在程序的不同位置都 可以且仅可以取到同一个对象实例 :如果实例不存在,会创建一个实例:如果已 ...
最新文章
- 互联网协议 — NTP 时间同步协议
- 行业研究报告基本分析思路updated with 5c model
- 包转发、吞吐量、背板带宽计算
- 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
- a标签跳到另一个页面指定选项卡_HTML常用标签
- Flink中的状态管理
- JAVA设计模式Design Pattern→单例模式Singleton Pattern、工厂模式Factory Pattern、代理模式Proxy Pattern
- VMware Workstation 12 安装小于4GB的GHOST 64位win7系统
- Popclip插件:任务自动添加进 Microsoft ToDo的任务列表
- MATLAB-数据插值
- 机器学习笔记 - 探索性数据分析(EDA) 学习进阶
- 唯物主义观点有哪些_唯物主义的观点及方法论有哪些?
- 大数据营销在电商领域的应用案例
- 生活中,如何学会放下
- Hyper-V的使用技巧及管理方法
- TB级倾斜摄影建模集群完美硬件配置方案
- 元宇宙时空——元宇宙是什么
- 多模态模型 CLIP4Clip 带你实现文本与视频互搜
- POJ3426 ACM Computer Factory——最大流(EK+输出路径)
- 差异表达基因热图怎么看_获得差异表达基因后-基因功能注释
热门文章
- 宁夏政务网 紫图高拍仪控件和文件上传控件的若干问题及解决方法
- 关于ioncube的license破解
- 计算机一级误差怎么计算,(excel最大偏差公式)偏离值怎么计算
- 荆州水文水位查询_长江水位实时查询网(长江水位公告实时查询)
- C/C++实现atoll函数
- 56个民族静态字典代码创建sql语句
- 云呐|国有资产管理信息系统,资产管理信息系统功能描述
- PyRadiomics工具包使用说明
- C#类库封装SDK调用:一个函数就能实现相应功能,省得你花时间去研究底层了,使用超级简单
- Eplan执行翻译操作详细教程