2012-04-08 22 views
2

デコレータ関数があります。クラス内の関数に適用しています。デコレータは、_apiメンバ変数に対してチェックを行うことになっています。しかし、私はこれをしようとするとglobal name 'self' is not definedエラーが発生します。正しい方法は何ですか?Pythonクラス内のデコレータ関数内の自己へのアクセス

def requires_api(fn): 
    def wrapped(*args, **kwargs): 
     if self._api is not None: 
      return fn(*args, **kwargs) 
     else: 
      return None 
    return wrapped 


@requires_api  
def do_something(self): 
... 

答えて

5

インスタンスへの参照は、その名前selfがavaialbleではありません、あなたのラッパー関数の*argsです。 args[0]を使用するか、またはちょうどとしてそれを書き換える:あなたがこれを行う場合は、ラップ機能に至るまでお電話でもselfを含める必要があり、

当然
def wrapper(self, *args, **kwargs): 
    # ... 

+0

ちょっと感謝 - ありがとう – Yarin

1

変更

if self._api is not None: 

selfを持って

args[0]

if hasattr(args[0], '_api'): 

へ。 hasattrは、属性をチェックする正しい方法です。

存在しない属性にアクセスしようとすると(self._apiが存在しない場合)、AttributeErrorが生成されます。

+1

ありがとう、あなたは間違いありませんでした。私の意見では間違っていましたが、コメントが必要です – Yarin

+0

@ヤリン:コメントはどうしたらいいですか? –

+0

@JoelCornett:編集をありがとう。私は同じことを書く準備をしていたのと同じように見つけました。 :) –

関連する問題