Python での複数のデコレータの呼び出し順序

高洛峰
リリース: 2017-02-17 11:01:19
オリジナル
1056 人が閲覧しました

はじめに

デコレータはプログラム開発でよく使われる関数であり、Python言語開発の基礎知識でもありますが、プログラム内でデコレータを合理的に使用できれば、開発効率が向上するだけでなく、コードを書きやすくなります。より読みやすくなりました^_^

使用シナリオ

簡単な例は次のシナリオです

  • 関数実行時間統計の紹介

  • 関数の実行 事前準備処理

  • 関数実行後の関数のクリーニング

  • 権限検証とその他のシナリオ

  • キャッシュ

  • Decorator case

    def user_login(fun):
        def islogin(request,*args,**kwargs):
            context = {}
            if request.session.has_key('uname'):
                context['uname'] = request.session.get('uname')
            else:
                context['uname'] = 'None'
            return fun(request,context,*args,**kwargs)
        return islogin
    ログイン後にコピー
@user_login
def ucOrder(request,context,pIndex):
    '''
    获取数据
    处理数据
    传递到页面上去
ログイン後にコピー
以上がdecoratorの使い方ですのエーターシンプルな電子商取引アプリケーションの場合、ucOrder 関数はユーザーのログイン後にのみ実行できます。デコレータを使用しない場合、一般的なアプローチは、ユーザーがログインしているかどうかを判断するための一連の検証コードを ucOrder に記述してから、その後の実行ロジックを決定することですが、これはより面倒です。

デコレーターの使用は比較的簡単です。デコレーターの形式に従って @user_login を ucOrder 関数に追加するだけで、Python インタープリターの実行時にコードが上から下に解釈され、最初に実行されます。 . user_login関数を使用し、user_login(ucOrder)に相当するucOrderをuser_login関数のパラメータとして渡し、ユーザーがログインしているかどうかを確認し、ucOrder関数を実行するかどうかを決定する機能を持ちます

。複数のデコレータの呼び出しシーケンス

def one(func):
    print('----1----')
    def two():
        print('----2----')
        func()
    return two

def a(func):
    print('----a----')
    def b():
        print('----b----')
        func()
    return b

@one
@a
def demo():
    print('----3----')

demo()
ログイン後にコピー

実行結果:

/usr/bin/python2.7 /home/python/Desktop/tornadoProject/one.py
----a----
----1----
----2----
----b----
----3----
ログイン後にコピー

実行結果から、複数のデコレータが使用されている場合でも、実行順序が少し奇妙であることがわかります。これはなぜでしょうか。

この問題に関しては、Python デコレータの実行順序に関する通説を説明できるより良い記事があります

複数の Python デコレータの呼び出し順序に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。


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