クラスメソッドのラッパーを作成し、特定のメソッドの呼び出しの前および/または後に実行する必要があります。クラスメソッドのデコレータ: 'getattr'との互換性
class MyClass:
def call(self, name):
print "Executing function:", name
getattr(self, name)()
def my_decorator(some_function):
def wrapper():
print("Before we call the function.")
some_function()
print("After we call the function.")
return wrapper
@my_decorator
def my_function(self):
print "My function is called here."
engine = MyClass()
engine.call('my_function')
これはラインgetattr(self, name)()
で私にエラーを与える:私はクラスメソッドの前にデコレータをコメントアウトした場合
TypeError: 'NoneType' object is not callable
が、それは完璧に動作します:ここで
は、最小限の例ですclass MyClass:
def call(self, name):
print "Executing function:", name
getattr(self, name)()
def my_decorator(some_function):
def wrapper():
print("Before we call the function.")
some_function()
print("After we call the function.")
return wrapper
# @my_decorator
def my_function(self):
print "My function is called here."
engine = MyClass()
engine.call('my_function')
出力は、
です。Executing function: my_function
My function is called here.
デコレータ自体は教科書の例と同じです。 getattr
で装飾されたメソッドをPythonで呼び出すと、何かが間違っているように見えます。
このコードを修正する方法はありますか?