在下面的代码中,类print_a的方法(print_bTest)已由两个不同的修饰器修饰。

我如何确定给定的方法(比如说print_a)在运行时是否用某些特定的装饰器(decorator1)装饰?

简单的解决方案是更改包装函数的名称,即在装饰器方法中将wrapper更改为wrapper1wrapper2,但是这样做的问题是我无法控制代码的这一部分。

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/

10-11 10:53