Maison >développement back-end >Tutoriel Python >Comprendre les décorateurs Python, avec des exemples

Comprendre les décorateurs Python, avec des exemples

Lisa Kudrow
Lisa Kudroworiginal
2025-02-19 09:51:10224parcourir

Understanding Python Decorators, with Examples

Cet article vous aidera à comprendre le concept des décorateurs dans la programmation Python et comment les utiliser le mieux. Nous couvrirons ce que sont les décorateurs Python, à quoi ressemble leur syntaxe, comment les reconnaître dans un script ou un cadre, et comment les appliquer vous-même.

Le décorateur de fonction en python n'est qu'une fonction qui prend une autre fonction comme un argument, étendant la fonction de la fonction décorée sans changer sa structure. Le décorateur enveloppe une autre fonction, améliore son comportement, puis le renvoie.

Le concept de décorateur à Python aide à garder le code sec (ne vous répétez pas). Les décorateurs de fonction évitent la duplication inutile dans la base de code, car certains extraits de code en double peuvent être combinés pour former un décorateur de fonction. Au fur et à mesure que vous avancez dans le développement avec Python, les décorateurs peuvent aider à l'analyse et à la documentation. Ils sont également essentiels à la mise en place de la vérification et de la vérification d'exécution.

Dans ce qui suit, je suppose que vous avez une compréhension de base des fonctions et de la programmation Python, et vous avez au moins installé Python 3.8 sur votre appareil.

Points clés

  • Un décorateur Python est une fonction qui prend une autre fonction comme un argument, qui améliore sa fonctionnalité sans changer sa structure. Ils aident à garder le code sec (ne vous répétez pas) en évitant la duplication inutile et peuvent être utilisés pour l'analyse, l'exploitation forestière, la validation et la vérification du temps d'exécution.
  • Dans Python, une fonction de décorateur est définie par une fonction externe qui reçoit des paramètres de fonction et une fonction imbriquée qui enveloppe la fonction de décoration à l'intérieur de la fonction externe. Les décorateurs sont facilement identifiés par le préfixe "@" avant la fonction de décorateur. Les paramètres peuvent être transmis à la fonction de wrapper puis à la fonction décorée.
  • Les décorateurs peuvent être enchaînés à Python, ce qui signifie qu'une fonction peut être décorée de plusieurs décorateurs. Cela se fait en empilant un décorateur sur un autre. Les cas d'utilisation pratiques pour les décorateurs de Python incluent la journalisation du temps, la mémoire et les décorateurs Python intégrés comme @classMethod, @StaticMethod et @Property.

choses à savoir avant de plonger dans les décorateurs de Python

Dans Python, les fonctions sont des citoyens de première classe, ce qui signifie qu'ils peuvent recevoir des paramètres ou être passés sous forme de paramètres. Afin de saisir pleinement le concept d'un décorateur, vous devez connaître les points suivants.

La fonction

est un objet, ce qui signifie qu'il peut être affecté à une autre variable

<code class="language-python">def greet():
    print("Hello John")

greet_john = greet
greet_john()
>>>
Hello John</code>

Rappelez-vous toujours qu'à Python, tout est un objet. De la même manière que vous attribuez une valeur à une variable, une fonction peut également être attribuée à une variable si nécessaire. Ceci est important lorsque vous apprenez des décorateurs.

La fonction peut retourner

à partir d'une autre fonction
<code class="language-python">def greet():
    def greeting_at_dawn():
        print("Good morning")

    return greeting_at_dawn

salute = greet()
salute()
>>>
Good morning</code>

Les fonctions internes dans Python peuvent être renvoyées des fonctions externes. Cela fait partie du concept de programmation fonctionnelle que vous rencontrerez.

Les fonctions peuvent être transmises en tant que paramètres d'une autre fonction

<code class="language-python">def greet_some(func):
    print("Good morning", end=' ')
    func()

def say_name():
    print("John")

greet_some(say_name)
>>>
Good morning John</code>

La fonction qui reçoit les paramètres de fonction est appelée fonction d'ordre supérieur.

Assurez-vous de garder à l'esprit les points ci-dessus lors de l'apprentissage de la mise en œuvre de décorateurs et de les utiliser efficacement dans les programmes Python.

Mécanisme de fonctionnement du décorateur Python

Une fonction de décorateur simple commence par la définition de la fonction, la fonction de décorateur, puis les fonctions imbriquées dans les fonctions de wrapper externes.

Gardez toujours les deux points suivants à l'esprit lors de la définition d'un décorateur:

  1. Pour implémenter un décorateur, définissez une fonction externe qui reçoit des paramètres de fonction.
  2. nid une fonction d'emballage dans la fonction de décorateur externe, qui enveloppe également la fonction décoratrice.

Ce qui suit est à quoi ressemble la fonction de décorateur la plus élémentaire dans l'extrait de code suivant:

<code class="language-python">def greet():
    print("Hello John")

greet_john = greet
greet_john()
>>>
Hello John</code>

Voir le code ci-dessus, la fonction externe increase_number (également connue sous le nom de décorateur) reçoit le paramètre de fonction func. increase_by_one est une fonction de wrapper qui contient la fonction décorée get_number. Le décorateur est affecté à une autre variable. C'est ce que signifie la syntaxe de décorateur lors de l'utilisation de Python Decorator. Cependant, il existe un moyen plus facile de représenter un décorateur.

Il est facile de reconnaître une fonction de décorateur simple lorsqu'il commence par le @ prefix et combine la fonction de décoration en dessous. L'exemple précédent peut être refactorisé comme suit:

<code class="language-python">def greet():
    def greeting_at_dawn():
        print("Good morning")

    return greeting_at_dawn

salute = greet()
salute()
>>>
Good morning</code>

Ces exemples montrent que le décorateur étend la fonctionnalité de ses paramètres de fonction.

Fonction décoratrice avec paramètres

Dans certains cas, vous devrez peut-être transmettre des paramètres au décorateur. La solution à ce problème est de passer l'argument à la fonction de wrapper, puis de le passer à la fonction décorée. Voir l'exemple suivant:

<code class="language-python">def greet_some(func):
    print("Good morning", end=' ')
    func()

def say_name():
    print("John")

greet_some(say_name)
>>>
Good morning John</code>

Passer des paramètres aux fonctions internes ou imbriquées les rend plus puissants et robustes car il offre plus de flexibilité pour manipuler les fonctions décorées. Un nombre de paramètres (* args) ou de paramètres de mots clés (** kwargs) peut être transmis à la fonction décorée. * Args permet la collecte de tous les paramètres de position, tandis que ** kwargs est utilisé pour tous les paramètres de mots clés requis lors d'un appel de fonction. Regardons un autre exemple simple:

<code class="language-python">def increase_number(func):
    def increase_by_one():
        print("incrementing number by 1 ...")
        number_plus_one = func() + 1
        return number_plus_one
    return increase_by_one

def get_number():
    return 5

get_new_number = increase_number(get_number)
print(get_new_number())
>>>
incrementing number by 1 ...
6</code>

Dans l'exemple ci-dessus, * Args prend les paramètres de position comme des tuples pour former un objet itérable, tandis que ** kwargs forme un dictionnaire de paramètre de mot-clé.

plusieurs décorateurs ou appels de chaîne en python

Lors de l'utilisation de Function Decorator dans des projets Python, il existe plusieurs options à explorer. Un autre cas d'utilisation consiste à relier un décorateur (deux ou plus) à une fonction. Une fonction peut être décorée de plusieurs décorateurs (plusieurs décorateurs), qui est réalisé en empilant un décorateur sur un autre, dans l'ordre sans pertinence. Quel que soit l'ordre dans lequel plusieurs décorateurs sont empilés, vous obtiendrez la même sortie que dans l'exemple suivant:

<code class="language-python">def increase_number(func):
    def increase_by_one():
        print("incrementing number by 1 ...")
        number_plus_one = func() + 1
        return number_plus_one
    return increase_by_one

@increase_number
def get_number():
    return 5

print(get_number())
>>>
incrementing number by 1 ...
6</code>

Cas d'utilisation pratiques pour Python Decorator

Une façon très populaire d'utiliser les décorateurs à Python est comme enregistreur de temps. Cela aide les programmeurs à comprendre combien de temps il faut pour exécuter une fonction pour mesurer l'efficacité.

La mémorisation est une autre façon cool d'utiliser des décorateurs à Python. Lorsque le calcul est effectué ultérieurement, les résultats des appels répétés à la fonction peuvent être facilement rappelés sans aucun changement. Vous pouvez simplement utiliser le décorateur pour mémoriser la fonction.

Les décorateurs Python intégrés comme @classMethod, @StaticMethod et @Property sont très populaires en mode OOP Decorator de Python.

Conclusion

Les décorateurs de Python appliquent les principes secs de l'ingénierie logicielle car ils sont utilisés comme code réutilisable. Pensez au nombre de fonctions Python que vous pouvez refacter dans les décorateurs. Dans cet article, nous explorons différentes formes de décorateurs. Il y a aussi des décorateurs de classe, bien que nous ne les couvrions pas ici.

Les décorateurs facilitent l'ajout de fonctionnalités supplémentaires à des fonctions, des méthodes ou des classes simples sans modifier leur code source tout en gardant le code sec. Essayez de décorer les fonctions vous-même pour mieux comprendre le motif du décorateur.

FAQ sur les décorateurs JavaScript

Qu'est-ce qu'un décorateur javascript?

JavaScript Decorator est un modèle de conception et une fonctionnalité introduite dans ECMAScript 2016 (ES6) et versions ultérieures de JavaScript. Il vous permet de modifier ou d'améliorer le comportement d'une fonction, d'une méthode ou d'une classe en y appliquant des commentaires ou des métadonnées. Les décorateurs sont couramment utilisés dans diverses bibliothèques et cadres JavaScript, tels que Angular et MOBX. Les décorateurs sont généralement mis en œuvre en fonction des fonctions qui enveloppent ou «décorent» des fonctions objectives ou des classes. Ils sont utilisés pour ajouter des fonctionnalités ou modifier le comportement d'une cible sans modifier son code central. Les décorateurs peuvent être appliqués aux fonctions, méthodes ou classes, et ils sont indiqués par le symbole @ suivi du nom du décorateur.

Pourquoi avons-nous besoin de décorateur JavaScript?

Les décorateurs en JavaScript sont un ajout précieux à la langue pour les raisons suivantes: ils favorisent la modularité et la réutilisabilité du code en permettant aux développeurs de séparer les préoccupations transversales de la logique principale des fonctions et des méthodes. Cela favorise une base de code plus propre en réduisant la confusion et en améliorant la lisibilité, ce qui rend le code plus facile à maintenir et à comprendre. Les décorateurs jouent un rôle important dans l'adhésion au principe de séparation des préoccupations, car ils vous permettent de séparer des aspects tels que la sécurité, l'exploitation forestière et la configuration de la logique d'application de base. Les décorateurs apportent une cohérence à votre base de code en veillant à ce que des comportements ou des politiques spécifiques soient appliqués de manière cohérente aux fonctions et aux méthodes. Ils fournissent un moyen flexible de configurer et de personnaliser le comportement des fonctions, permettant des changements faciles ou une extension des fonctionnalités sans modifier le code de base. En soutenant la programmation orientée vers l'aspect (AOP), les décorateurs aident systématiquement à répondre aux préoccupations transversales, entraînant un code plus propre et plus organisé. Les décorateurs sont également de plus en plus adoptés par des bibliothèques et des cadres tiers, ce qui en fait une compétence incontournable pour une utilisation efficace des outils JavaScript modernes. Dans l'ensemble, les décorateurs améliorent l'organisation du code, la lisibilité, la maintenabilité et l'évolutivité, ce qui en fait des actifs précieux pour les développeurs JavaScript.

Quelle est la différence entre un décorateur Python et un décorateur JavaScript?

Les décorateurs de python et javascript partagent le concept de modification de la fonction ou du comportement de la méthode, mais diffèrent en syntaxe et en utilisation. Python utilise la syntaxe @decorator_function et peut être appliqué aux fonctions et classes à diverses fins. JavaScript Decorator utilise la syntaxe @decorator et est principalement utilisé pour les classes, les méthodes et les propriétés. Les décorateurs de Python sont plus polyvalents, tandis que les décorateurs JavaScript sont centrés sur la classe et ont été introduits dans le cadre de Ecmascript 2016.

La sortie maintient le formatage d'image d'origine et ne modifie pas la signification centrale du texte d'entrée.

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