在下面的代码中,类print_a
的方法(print_b
和Test
)已由两个不同的修饰器修饰。
我如何确定给定的方法(比如说print_a
)在运行时是否用某些特定的装饰器(decorator1
)装饰?
简单的解决方案是更改包装函数的名称,即在装饰器方法中将wrapper
更改为wrapper1
和wrapper2
,但是这样做的问题是我无法控制代码的这一部分。
python是否有像Java这样的反射API,这对我有帮助吗?
def my_decorator1(func):
def wrapper(*args, **kwargs):
print('I am decorated:1')
func(*args, **kwargs)
return wrapper
def my_decorator2(func):
def wrapper(*args, **kwargs):
print('I am decorated:2')
func(*args, **kwargs)
return wrapper
class Test():
def __init__(self, a=None, b=None):
self.a = a
self.b = b
@my_decorator1
def print_a(self):
print('Value of a is {}'.format(self.a))
@my_decorator2
def print_b(self):
print('Value of b is {}'.format(self.b))
if __name__ == '__main__':
d = Test.__dict__
f1 = d.get('print_a')
f2 = d.get('print_b')
最佳答案
Python装饰器更像是转换函数,而不是像简单的元数据标签那样,就像Java注释那样。为此,我要让装饰器在要包装的函数上设置一个属性(或将其包装在特定类型的可调用对象中):
def my_decorator1(func):
def wrapper(*args, **kwargs):
print('I am decorated:1')
func(*args, **kwargs)
wrapper.decorator_name = 'my_decorator1'
return wrapper
然后:
print(Test.print_a.decorator_name)
另外,在Python 3.3+中,您可以使用PEP 3155的
__qualname__
标识装饰器。关于python - 如何在运行时获取装饰器的名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47688983/