1

デコレータ@wrapperwraptライブラリを使用して、ラップされた関数のクラスにアクセスし、クラスの名前を取得しています。それを使用して、期待どおりAnimal.method()foo()機能します。

問題:ただし、 でAnimal.classy装飾されたメソッドはそのクラス名として@classmethod与えられており、 で装飾されたメソッドはそのクラスを取得できません。typeAnimal.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
4

1 に答える 1