装饰器工具

此处定义的方法和类皆为 装饰器 可以用于为可调用对象增加一些前后置的处理。

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_useTrue

[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_usefoo 方法结束后才置为了False

[8]:
example.is_in_use
[8]:
False

作为对照,将 bar 传入被flagmethod装饰的 la 方法中,则flag:is_in_usebar 方法内为 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)