python装饰器--原来如此简单,Python 类装饰器
单一模式
使用模块
其实Python的模块是天然的singleton模式,因为模块第一次导入的时候会生成一个. pyc文件,第二次导入的时候会直接加载。pyc文件,而无需再次执行模块代码。因此,我们只需要在一个模块中定义相关的函数和数据,就可以得到一个singleton对象。如果我们真的想要一个单例类,我们可以考虑这样做:
# mysingleton.py
类My_Singleton(对象):
def foo(自身):
及格
my_singleton=My_Singleton()
将上面的代码保存在文件mysingleton.py中,并像这样使用它:
从mysingleton导入my_singleton
my_singleton.foo()
一个
2
三
从mysingleton导入my_singleton
my_singleton.foo()
使用__new__
为了使一个类只有一个实例,我们可以使用new来控制实例的创建过程。代码如下:
类单例(对象):
_instance=无
def __new__(cls,*args,**kw):
如果不是cls。_实例:
cls。_instance=super(Singleton,cls)。__new__(cls,*args,**kw)
返回cls。_实例
类MyClass(Singleton):
a=1
在上面的代码中,我们将类的实例与类变量instance关联起来。如果cls。_instance为None,我们创建实例,否则直接返回cls。_instance。
实现如下:
one=MyClass()
two=MyClass()
一=二
真实的
一等于二
真实的
id(一),id(二)
(4303862608, 4303862608)
使用装饰器
我们知道,装饰器可以动态地修改类或函数的功能。在这里,我们还可以使用装饰器来装饰一个类,使它只能生成一个实例。代码如下:
从functools导入包装
def singleton(cls):
实例={}
@wraps(cls)
def getinstance(*args,**kw):
如果cls不在实例中:
实例[cls]=cls(*args,**kw)
返回实例[cls]
返回getinstance
@单身
类MyClass(对象):
a=1
从functools导入包装
上面,我们定义了一个decorator singleton,它返回一个内部函数getinstance,这个函数将确定一个类是否在字典实例中。如果不存在,它会将cls存储为键,将cls(*args,**kw)存储为实例中的值。否则,它将直接返回实例[cls]。
使用元类
元类可以控制创建类的过程,它主要做三件事:
拦截类的创建。
修改类的定义
返回修改后的类。
使用元类实现单例模式的代码如下:
类Singleton(类型):
_instances={}
def __call__(cls,*args,**kwargs):
如果cls不在cls。_实例:
cls。_ instances[cls]=super(Singleton,cls)。__call__(*args,**kwargs)
返回cls。_实例[cls]
# Python2
类MyClass(对象):
__元类__=单例
# Python3
# class my class(meta class=Singleton):
#通过
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。