デコレータ@wrapper
はwrapt
ライブラリを使用して、ラップされた関数のクラスにアクセスし、クラスの名前を取得しています。それを使用して、期待どおりAnimal.method()
にfoo()
機能します。
問題:ただし、 でAnimal.classy
装飾されたメソッドはそのクラス名として@classmethod
与えられており、 で装飾されたメソッドはそのクラスを取得できません。type
Animal.static
@staticmethod
@wrapper
デコレータ関数がandのクラス名Animal
を取得することは可能ですか?Animal.classy()
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