クラス フィールドをクラス メソッド デコレータに渡す
クラス メソッドのデコレータにクラス フィールドを渡そうとすると、フィールドが存在しないことを示すエラー。これは、クラス定義時にフィールドを渡そうとしているが、その段階ではフィールドを使用できない可能性があるために発生します。
解決策 1: 実行時チェック
これを解決するには、代わりに実行時にフィールドをチェックすることを検討してください。これは、最初の引数がインスタンスとなるメソッド引数をインターセプトするようにデコレータを変更することで実現できます。インスタンス属性には、.:
<code class="python">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()</code>
を使用してアクセスできます。解決策 2: 属性名を文字列として使用します
デコレータで属性名をハードコーディングしたくない場合は、 、文字列として渡すことができます:
<code class="python">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</code>
以上がクラスフィールドをクラスメソッドデコレータに渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。