Heim  >  Artikel  >  Backend-Entwicklung  >  Die Aufrufreihenfolge mehrerer Dekoratoren in Python

Die Aufrufreihenfolge mehrerer Dekoratoren in Python

高洛峰
高洛峰Original
2017-02-17 11:01:191085Durchsuche

Vorwort

Dekorator ist eine Funktion, die häufig in der Programmentwicklung verwendet wird, und es handelt sich auch um Grundkenntnisse der Python-Sprachentwicklung. Wenn Dekoratoren im Programm sinnvoll eingesetzt werden können, kann dies nicht nur die Entwicklungseffizienz verbessern. Es kann aber auch dazu führen, dass der von Ihnen geschriebene Code anspruchsvoller aussieht ^_^

Verwendungsszenarien

Es gibt viele Orte, an denen Dekoratoren verwendet werden können. Ein einfaches Beispiel ist das folgende Szenario

  • Einführung in Protokolle

  • Statistiken zur Funktionsausführungszeit

  • Vorbereitende Verarbeitung vor der Ausführung der Funktion

  • Reinigungsfunktion nach Ausführung von Funktionen

  • Berechtigungsüberprüfung und andere Szenarien

  • Cache

Dekorator-Fall

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):
    '''
    获取数据
    处理数据
    传递到页面上去

Das Obige ist ein Fall der Verwendung von Dekoratoren in einer einfachen E-Commerce-Anwendung, in der die ucOrder-Funktion erst ausgeführt werden kann, nachdem sich der Benutzer angemeldet hat . Wenn Sie keinen Dekorator verwenden, besteht der übliche Ansatz möglicherweise darin, eine Reihe von Bestätigungscodes in ucOrder zu schreiben, um festzustellen, ob der Benutzer angemeldet ist, und dann die anschließende Ausführungslogik zu bestimmen, was problematischer ist.

Dann ist es relativ einfach, nach der Verwendung des Dekorators @user_login entsprechend dem Format des Dekorators hinzuzufügen. Wenn der Python-Interpreter dann ausgeführt wird, wird er von oben nach unten erklärt Unten führt der Code zuerst die Funktion user_login aus und übergibt ucOrder als Parameter der Funktion user_login, was äquivalent zu user_login(ucOrder) ist. Diese Funktion überprüft, ob der Benutzer angemeldet ist, und bestimmt so, ob ucOrder ausgeführt werden soll Funktion

Die von mehreren Dekoratoren verwendete Aufrufsequenz

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()

Ausführungsergebnisse:

/usr/bin/python2.7 /home/python/Desktop/tornadoProject/one.py
----a----
----1----
----2----
----b----
----3----

Aus den Ausführungsergebnissen können Sie ersehen, dass dies der Fall ist, wenn mehrere Dekoratoren verwendet werden Die Ausführungsreihenfolge ist immer noch etwas seltsam, warum ist das so?

Zu diesem Problem gibt es bessere Artikel zur Erklärung, Mythen über die Ausführungsreihenfolge von Python-Dekoratoren


Mehr Python-Aufrufreihenfolge für mehrere Dekoratoren Bitte achten Sie auf verwandte Artikel zur chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn