Maison  >  Article  >  développement back-end  >  Par quoi commence un décorateur python ?

Par quoi commence un décorateur python ?

(*-*)浩
(*-*)浩original
2019-07-20 13:30:523198parcourir

Les décorateurs sont une partie importante de Python. En termes simples : ce sont des fonctions qui modifient la fonctionnalité d’autres fonctions. Ils contribuent à rendre notre code plus court et plus pythonique.

Par quoi commence un décorateur python ?

Pour comprendre les décorateurs en Python, vous devez d'abord comprendre le concept de fermeture. (Apprentissage recommandé : Tutoriel vidéo Python)

En informatique, fermeture (anglais : Closure), également appelée fermeture lexicale (Lexical Closure) ou fermeture de fonction (function Closures) sont des fonctions qui font référence à des variables libres. La variable libre référencée restera avec la fonction même après avoir quitté l'environnement dans lequel elle a été créée.

Décorateur

Un décorateur commun ressemble généralement à ceci :

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('call %s():' % func.__name__)
        print('args = {}'.format(*args))
        return func(*args, **kwargs)

    return wrapper

Ceci définit une décoration qui imprime le nom de la méthode et ses paramètres de périphérique.

Pour l'appeler, doit commencer par @ :

@logdef test(p):
    print(test.__name__ + " param: " + p)
    
test("I'm a param")

Sortie :

call test():
args = I'm a param
test param: I'm a param

Lorsque le décorateur est utilisé, la syntaxe @ est utilisé, c'est un peu troublant. En fait, le décorateur n'est qu'une méthode, pas différente de la méthode d'appel suivante :

def test(p):    print(test.__name__ + " param: " + p)

wrapper = log(test)
wrapper("I'm a param")

@La syntaxe passe simplement la fonction dans la fonction décorateur, il n'y a rien de magique à cela il.

Il convient de noter @functools.wraps(func), qui est le décorateur fourni par python. Il peut copier les méta-informations de la fonction d'origine vers la fonction func du décorateur. Les métainformations de la fonction incluent la docstring, le nom, la liste des paramètres, etc.

Vous pouvez essayer de supprimer @functools.wraps(func), vous constaterez que la sortie de test.__name__ devient un wrapper.

Pour plus d'articles techniques liés à Python, veuillez visiter la colonne Tutoriel Python pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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