装饰器工具¶
此处定义的方法和类皆为 装饰器 可以用于为可调用对象增加一些前后置的处理。
flagmethod¶
进出方法时设置flag的方法,接受自定义的 flag
作为设置的flag的变量名,当调用被装饰的方法时,将该方法所在对象的 flag
成员变量置为 True
,结束时(包括异常退出),置为False
例如现在有如下对象,用 flagmethod
装饰 foo
方法和 invalid
方法,并将成员变量 is_in_use
设置为flag
[1]:
from deepfos.lib.decorator import flagmethod
class Example:
def __init__(self):
self.is_in_use = False
@flagmethod('is_in_use')
def foo(self, arg):
self.bar()
def bar(self):
print(self.is_in_use)
[2]:
example = Example()
调用被装饰的foo方法,可见在foo方法内,is_in_use
为 True
[3]:
example.foo(1)
True
在foo方法结束后,is_in_use
被置为了 False
[4]:
example.is_in_use
[4]:
False
FlagMethod¶
与 flagemethod
类似,区别是,这是一个装饰器类,可支持嵌套调用时,flag的一致性
编写装饰器nested_flagmethod方法,在该方法中将所装饰的方法和flag名称传给FlagMethod类
[5]:
from deepfos.lib.decorator import FlagMethod
def nested_flagmethod(flag):
def wrapper(method):
return FlagMethod(flag, method)
return wrapper
[6]:
class Example:
def __init__(self):
self.is_in_use = False
@nested_flagmethod('is_in_use')
def foo(self, arg):
print('In foo:',self.is_in_use)
def bar(self, arg):
print('In bar:',self.is_in_use)
@flagmethod('is_in_use')
def la(self, arg):
print('In la:',self.is_in_use)
将example的 bar
方法传入 foo
[7]:
example = Example()
example.foo(example.bar(1))
In bar: True
In foo: True
flag:is_in_use
在 foo
方法结束后才置为了False
[8]:
example.is_in_use
[8]:
False
作为对照,将 bar
传入被flagmethod装饰的 la
方法中,则flag:is_in_use
在 bar
方法内为 False
,在 la
内为True,在嵌套的方法内未保持一致性
[9]:
example.la(example.bar(1))
In bar: False
In la: True
[10]:
example.is_in_use
[10]:
False
singleton¶
将所装饰的对象变为单例对象
[11]:
from deepfos.lib.decorator import singleton
@singleton
class Example:
def __init__(self,id):
self.id = id
[12]:
example1 = Example(1)
example2 = Example(2)
此时,经过了两次分别实例化的对象example1和example2是同一个对象
[13]:
example1 == example2
[13]:
True
[14]:
example1.id,example2.id
[14]:
(1, 1)