他のクラスのメソッドをデコレートするデコレータクラスを実装しようとしています。しかし、デコレータで装飾されたメソッドを保持するクラスが必要です。私はそれをどこでも見つけることができない。Pythonで装飾されたメソッドを含むクラスを見つける方法
class my_decorator(object):
def __init__(self, arg1, arg2):
print(self.__class__.__name__ + ".__init__")
self.arg1 = arg1
self.arg2 = arg2
def __call__(self, my_callable):
print(self.__class__.__name__ + ".__call__")
print(type(my_callable))
self.my_callable = my_callable
# self.my_callable_method_class = ?where to get this?
def function_wrapper(*args, **kwargs):
print(self.__class__.__name__ + ".function_wrapper")
print(self.arg1)
self.my_callable.__call__(*args, **kwargs)
print(self.arg2)
return function_wrapper
class MyClass(object):
@my_decorator(arg1="one", arg2="two")
def decorated_method(self):
print(self.__class__.__name__ + ".decorated_method")
print(type(self.decorated_method))
print("hello")
m = MyClass()
m.decorated_method()
このプリントアウトします:
my_decorator.__init__
my_decorator.__call__
<type 'function'>
my_decorator.function_wrapper
one
MyClass.decorated_method
<type 'instancemethod'>
hello
two
を呼び出し可能なタイプの機能であるデコレータのクラスでは、クラス自体の内部で、それはタイプinstancemethodでありながら
は、ここでの例です。私はinstance_ethodからim_classを得ることができますが、そのようなことは機能しません。
デコレータ内からデコレーションされたメソッドを含むクラスを取得するにはどうすればよいですか?
私はこれを行うことができます:
class my_decorator(object):
def __init__(self, cls, arg1, arg2):
.
.
class MyClass(object):
@my_decorator(cls=MyClass, arg1="one", arg2="two")
def decorated_method(self):
.
.
をしかし、それは冗長で素敵ではないので、私はそれを行うには好きではないだろう。
これを別の方法で実装する必要がありますか?私は基本的にデコレータにいくつかの議論が必要です。デコレータにデコレートされたメソッドのクラスが必要です。
正確にクラスが必要なのはいつですか?内部ラッパーを 'def function_wrapper(self、* args、** kwargs)'に変更し、クラスを 'self .__ class__'として取得することができます。デコレータの外にクラスが必要な場合は、katrielalexが既に指摘しているように、もっと難しくなります。 – Bakuriu