Python:带有装饰器的函数__qualname__

时间:2018-06-12 11:15:08

标签: python python-3.x decorator python-decorators

我在另一个类的Instance方法中使用了Decorator(类),如下所示:

class decorator_with_arguments(object):

    def __init__(self, arg1=0, arg2=0, arg3=0):
        self.arg1 = arg1
        self.arg2 = arg2
        self.arg3 = arg3

    def __call__(self, f):
        print("Inside __call__()")
        def wrapped_f(*args):
            print(f.__qualname__)
            f(*args)
        return wrapped_f

class Lol:
    @decorator_with_arguments("hello")
    def sayHello(self,a1, a2, a3, a4):
        print(self.sayHello.__qualname__)

现在,当我打印self.sayHello.__qualname__时,它会打印decorator_with_arguments.__call__.<locals>.wrapped_f

有没有办法覆盖这个?我希望在此处看到Lol.sayHello(我的原始函数的 qualname )。

我尝试覆盖@property的{​​{1}} __qualname__(带有静态字符串);没用。

1 个答案:

答案 0 :(得分:3)

您只需将__qualname__属性复制到 wrapped_f包装函数;毕竟,在应用装饰器时会返回此函数。

您可以使用@functools.wraps() decorator为您执行此操作,以及其他注意事项:

from functools import wraps

class decorator_with_arguments(object): 
    def __init__(self, arg1=0, arg2=0, arg3=0):
        self.arg1 = arg1
        self.arg2 = arg2
        self.arg3 = arg3

    def __call__(self, f):
        print("Inside __call__()")
        @wraps(f)
        def wrapped_f(*args):
            print(f.__qualname__)
            f(*args)
        return wrapped_f

@wraps(f)装饰器会将f的相关属性复制到wrapped_f,包括__qualname__

>>> Lol.sayHello.__qualname__
'Lol.sayHello'