ホームページ >バックエンド開発 >Python チュートリアル >インスタンス属性を Python のクラス メソッド デコレーターに引数として渡すことはできますか?
クラス フィールドをクラス メソッド デコレータに渡す
Python では、追加の引数を取るデコレータを使用してクラス メソッドを装飾できます。ただし、インスタンス属性を引数としてこれらのデコレータに渡そうとすると、疑問が生じます。
次の例を考えてみましょう:
<code class="python">class Client(object): def __init__(self, url): self.url = url @check_authorization("some_attr", self.url) def get(self): do_work()</code>
目的は、self.url 属性を check_authorization デコレータに渡すことです。 。ただし、Python はクラス定義スコープに self が存在しないことを示すエラーを生成します。
解決策
この問題を解決するには、属性チェックを実行時に延期できます。デコレータでメソッドの引数をインターセプトすることによって。ラッパー関数の最初の引数はインスタンスとなり、インスタンス属性へのアクセスが可能になります。
<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() # Output: http://www.google.com # get</code>
代替アプローチ
または、次のパスを渡すことで属性に動的にアクセスできます。属性名を文字列としてデコレータに渡します。これにより、特定の属性名をハードコーディングする必要がなくなります。
<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>
以上がインスタンス属性を Python のクラス メソッド デコレーターに引数として渡すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。