【发布时间】:2017-03-18 14:40:03
【问题描述】:
我有两个装饰器。每个装饰器都获得一个函数作为参数。每个装饰器都为函数设置一个属性。在将装饰器链接到单个函数后,我希望看到 2 个新属性。但是,顶部装饰器 t2 “覆盖”了属性 t1 集。否则,在一切都解决后,t1 不再存在。谁能解释一下为什么以及如何解决它?
def t1(function):
def wrapper(*args, **kwargs):
setattr(wrapper, "t1", True)
return function(*args, **kwargs)
setattr(wrapper, "t1", False)
return wrapper
def t2(function):
def wrapper(*args, **kwargs):
setattr(wrapper, "t2", True)
return function(*args, **kwargs)
setattr(wrapper, "t2", False)
return wrapper
@t2
@t1
def test():
pass
【问题讨论】:
-
t1“包装”函数test,然后t2“包装”由t1返回的函数。因此t2应该期望一个 decorated 函数作为它的参数——而不是test。 -
作为文体方面的一点,the PEP8 standard 要求缩进 4 个空格。虽然只有 1 在语法上有效,但它真的很难阅读,并且很难与他人共享您的代码。
-
是的,我明白了。如果我 dir(function) t2 的输入,我会看到属性 t1。但是,如果我 dir(test),我只会看到 t2(t1 被擦除)。
-
对不起,缩进,我正在做一个小显示器。
标签: python python-2.7 python-decorators