クラスフィールドをクラスメソッドのデコレータに引数として渡すにはどうすればよいですか? 私がやりたいことは次のようなものです:
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
self.url
デコレータに渡すための self が存在しないというエラーが表示されます。これを回避する方法はありますか?
ベストアンサー1
はい。クラス定義時にインスタンス属性を渡すのではなく、実行時にチェックします。
def check_authorization(f):
def wrapper(*args):
print args[0].url
return f(*args)
return wrapper
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization
def get(self):
print 'get'
>>> Client('http://www.google.com').get()
http://www.google.com
get
getattr
デコレータはメソッド引数をインターセプトします。最初の引数はインスタンスなので、そこから属性を読み取ります。属性名をハードコードしたくない場合は、属性名を文字列としてデコレータに渡して使用できます。
def check_authorization(attribute):
def _check_authorization(f):
def wrapper(self, *args):
print getattr(self, attribute)
return f(self, *args)
return wrapper
return _check_authorization