Moo*_*ors 3 python decorator python-3.x python-decorators
我在另一个类的实例方法中使用装饰器(类),如下所示:
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__)
Run Code Online (Sandbox Code Playgroud)
现在,当我打印出来时,self.sayHello.__qualname__它会打印decorator_with_arguments.__call__.<locals>.wrapped_f
有什么办法可以覆盖这个吗?我想在这里看到Lol.sayHello(我的原始函数的全称)。
我尝试覆盖@property __qualname__of __call__(使用静态字符串);没用。
您可以简单地将__qualname__属性复制到wrapped_f包装函数中;毕竟,应用装饰器时返回的就是这个函数。
您可以使用@functools.wraps()装饰器以及其他值得注意的属性来为您执行此操作:
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
Run Code Online (Sandbox Code Playgroud)
那里的装饰器从on@wraps(f)复制相关属性,包括:fwrapped_f__qualname__
>>> Lol.sayHello.__qualname__
'Lol.sayHello'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1949 次 |
| 最近记录: |