装饰器@wrapper
正在使用wrapt
库来访问包装函数的类以获取类的名称。使用它Animal.method()
并按foo()
预期工作。
问题:但是,用Animal.classy
修饰的方法@classmethod
给出type
了它的类名,而用Animal.static
修饰的方法@staticmethod
无法检索到它的类。
@wrapper
装饰器函数是否可以Animal
获取Animal.classy()
and的类名Animal.static()
?
预期产出
foo
Animal.method
Animal.classy
Animal.static
获得的输出
foo
Animal.method
type.classy
static
重现代码
import wrapt
import time
@wrapt.decorator
def wrapper(wrapped, instance, args, kw):
if instance is not None:
print(f'\n{instance.__class__.__name__}.{wrapped.__name__}')
else:
print('\n' + wrapped.__name__)
result = wrapped(*args, **kw)
return result
@wrapper
def foo():
time.sleep(0.1)
class Animal:
@wrapper
def method(self):
time.sleep(0.1)
@wrapper
@classmethod
def classy(cls):
time.sleep(0.1)
@wrapper
@staticmethod
def static():
time.sleep(0.1)
if __name__ == '__main__':
foo() # foo
Animal().method() # Animal.method
Animal.classy() # type.classy
Animal.static() # static