我在另一个类的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__
(带有静态字符串);没用。
答案 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'