インスタンス属性を Python のクラス メソッド デコレーターに引数として渡すことはできますか?

Barbara Streisand
リリース: 2024-10-18 12:02:36
オリジナル
781 人が閲覧しました

Can Instance Attributes be Passed as Arguments to Class Method Decorators in 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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!