0
この質問はanother questionに関連しています。Pythonデコレータに引数の不明なリストを送る方法 - デコレータが別のクラスのメソッドである場合?
以下に示すように、私はPythonデコレータを作成しました。私は、このデコレータが不明な引数のリストを受け入れるようにしたい。しかし、しわがあります。デコレータは、別のクラスのインスタンスメソッドである:
#!/usr/bin/env python
from functools import wraps
class A:
def my_decorator(self, func=None, **kwargs):
def inner_function(decorated_function):
def wrapped_func(*fargs, **fkwargs):
print kwargs
return decorated_function(*fargs, **fkwargs)
return wrapped_func
if func:
return inner_function(func)
else:
return inner_function
class B:
my_a = A()
@my_a.my_decorator(arg_1="Yolo", arg2="Bolo")
def my_func():
print "Woo Hoo!"
my_B = B()
B.my_func()
しかし、以下、このコードは動作しません:
Traceback (most recent call last):
File "./decorator_test.py", line 30, in <module>
B.my_func()
TypeError: unbound method wrapped_func() must be called with B instance as first argument (got nothing instead)
それを修正する方法は?
class A:
def __init__(self, func=None, **kargs):
self.args = func
self.kargs = kargs
def __call__(self, decorated_function):
def wrapper_func(*args, **kargs):
print kargs
return decorated_function(*args, **kwargs)
if self.func:
#..do something..
return wrapper_func
elif 'xyz' in self.kargs:
#...do something else here..
return wrapper_func
else:
...
class B:
@A(arg_1="Yolo", arg2="Bolo") # A(...)(my_func)
def my_func():
print "Woo Hoo!"
これはデコレータを符号化する一般的な方法である:
ここで '@ staticmethod'を忘れましたか? 'my_func()'は 'B'のメソッドであり、オブジェクトを呼び出す必要があるためです。 'self'パラメータもありません。または、それは 'my_B.my_func()'でなければなりません(その場合、 'self'はまだ失われています)。 – dhke
私は 'my_B.my_func()'を意味しました。ごめんなさい。私はタイプミスを修正し、現在は動作しています。 –