Maison >développement back-end >Tutoriel Python >L'ordre d'appel de plusieurs décorateurs en Python

L'ordre d'appel de plusieurs décorateurs en Python

高洛峰
高洛峰original
2017-02-17 11:01:191143parcourir

Avant-propos

Le décorateur est une fonction souvent utilisée dans le développement de programmes, et c'est aussi la connaissance de base du développement du langage Python. Si les décorateurs peuvent être utilisés raisonnablement dans le programme, cela peut non seulement améliorer l'efficacité du développement, mais aussi Cela peut rendre le code que vous écrivez plus sophistiqué ^_^

Scénarios d'utilisation

Il existe de nombreux endroits où les décorateurs peuvent être utilisés. Un exemple simple est le scénario suivant

<.>
  • Présentation des journaux

  • Statistiques du temps d'exécution de la fonction

  • Traitement préparatoire avant l'exécution de la fonction

  • Fonction de nettoyage après l'exécution de fonctions

  • Vérification des autorisations et autres scénarios

  • Cache

Cas du décorateur

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):
    '''
    获取数据
    处理数据
    传递到页面上去
Ce qui précède est un cas d'utilisation de décorateurs dans une application de commerce électronique simple, dans laquelle la fonction ucOrder ne peut être exécutée qu'après la connexion de l'utilisateur . Si vous n'utilisez pas de décorateur, l'approche courante peut consister à écrire un tas de codes de vérification dans ucOrder pour déterminer si l'utilisateur est connecté, puis à déterminer la logique d'exécution ultérieure, ce qui est plus gênant.

Ensuite, c'est relativement simple après avoir utilisé le décorateur. Il vous suffit de suivre le format du décorateur et d'ajouter @user_login à la fonction ucOrder. Ensuite, lorsque l'interpréteur python sera exécuté, il l'expliquera de haut en bas. en bas. Le code exécute d'abord la fonction user_login et passe ucOrder comme paramètre de la fonction user_login, ce qui est équivalent à user_login(ucOrder). Cela sert de fonction pour vérifier si l'utilisateur est connecté, puis décider s'il doit être exécuté. la fonction ucOrder

La séquence d'appel utilisée par plusieurs décorateurs

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()
Résultats de l'exécution :

/usr/bin/python2.7 /home/python/Desktop/tornadoProject/one.py
----a----
----1----
----2----
----b----
----3----
Vous pouvez voir dans les résultats de l'exécution que si plusieurs décorateurs sont utilisés , c'est L'ordre d'exécution est encore un peu bizarre, pourquoi ?

Concernant ce problème, il existe de meilleurs articles pour expliquer, les mythes sur l'ordre d'exécution du décorateur Python


Plus d'ordre d'appel de décorateur multiple Python Pour les articles connexes, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn