Tutoriel Python Decorator: Comment utiliser des décorateurs en Python

Cet article couvre le concept de décorateur en python avec un tutoriel détaillé comprenant divers exemples réels comme des décorateurs fantaisie, etc.

Les fonctions en python permettent une implémentation optimisée de la logique d'exécution de n'importe quel programme, plusieurs fois avec une exécution sans tracas. Les décorateurs en python tournent également autour du concept de Dans cet article, nous allons passer en revue Décorateurs en détail, y compris divers exemples dans ce tutoriel de décorateur python. Les sujets suivants sont abordés dans ce blog.



Quelles sont les fonctions en Python?

Les décorateurs en Python sont un sujet avancé. Donc, avant de continuer, assurez-vous d'être parfaitement clair avec le concept des fonctions python. Il y a quelques prérequis qu'il faut comprendre avant de passer aux décorateurs en Python.



  • Première classe Objets

  • Fonctions internes



Objets de première classe

En python, tout est traité comme un objet, y compris tous les Types de données , les fonctions aussi. Par conséquent, une fonction est également appelée objet de première classe et peut être transmise en tant qu'arguments.

Prenons un exemple pour comprendre comment cela fonctionne.

def func1 (nom): return f'Bonjour {nom} 'def func2 (nom): return f' {nom}, comment vas-tu? ' def func3 (func4): retourne func4 ('Cher apprenant') print (func3 (func1)) print (func3 (func2))
 Production: Bonjour cher apprenant Cher apprenant, comment allez-vous?

Dans l'exemple ci-dessus, nous avons utilisé le pour obtenir le nom et passer func1 et func2 comme argument dans func3.



Fonctions internes

En python, il est possible de définir des fonctions à l'intérieur d'une fonction. Cette fonction est appelée une fonction interne. Voici un exemple pour montrer comment nous pouvons utiliser les fonctions internes en python.

comment gérer la fenêtre contextuelle dans sélénium webdriver
def func (): print ('première fonction') def func1 (): print ('première fonction enfant') def func2 (): print ('deuxième fonction enfant') func1 () func2 () func ()
 Production: première fonction première fonction enfant deuxième fonction enfant

Dans le programme ci-dessus, peu importe la façon dont les fonctions enfants sont déclarées. La sortie dépend de la manière dont les fonctions enfants sont exécutées. Ils ont une portée locale avec func () et ne peuvent donc pas être appelés séparément.

Si vous les appelez séparément, vous obtiendrez une erreur car ils sont stockés sous variables à l'intérieur de func () et ne peut être appelée que si func () est appelée.

Renvoyer une fonction depuis une fonction

Il est possible de renvoyer une fonction en utilisant une autre fonction. Jetez un œil à l'exemple ci-dessous pour comprendre cela.

def func (n): def func1 (): retourne 'edureka' def func2 (): retourne 'python' si n == 1: retourne func1 else: retourne func2 a = func (1) b = func (2) print ( a ()) imprimer (b ())
 Production: python edureka

Décorateurs en Python

Les décorateurs en python sont très puissants qui modifient le comportement d'une fonction sans la modifier définitivement. Il encapsule essentiellement une autre fonction et comme les deux fonctions sont appelables, il renvoie un appelable.

Avec le recul, un décorateur encapsule une fonction et modifie son comportement. Jetons un coup d'œil à un exemple simple pour comprendre comment nous pouvons travailler avec des décorateurs en python.

def function1 (function): def wrapper (): print ('bonjour') function () print ('welcome to python edureka') return wrapper def function2 (): print ('Pythonista') function2 = function1 (function2) function2 ( )
 Production: bonjour pythonista bienvenue dans python edureka

Pour rendre les choses un peu plus faciles pour les programmeurs, nous avons un sucre syntaxique avec des décorateurs python. Jetez un œil à un exemple ci-dessous pour comprendre comment cela fonctionne.

def function1 (function): def wrapper (): print ('bonjour') function () print ('comment ça va?') return wrapper @ function1 def function2 (): print ('pythonista') function2 ()
 Production: bonjour pythonista comment vas-tu?

La sortie sera similaire au programme ci-dessus, la seule différence est que nous avons utilisé la syntaxe à secteurs avec le symbole @.

Utiliser des décorateurs avec des arguments

Lorsque vous avez une fonction avec des arguments, cela devient plus compliqué pour la fonction de décorateur car elle a également besoin d'arguments dans la déclaration. Pour résoudre ce problème, nous pouvons utiliser les * args et ** kwargs dans la fonction enveloppe interne. Jetez un œil à l'exemple suivant pour comprendre cela.

def function1 (function): def wrapper (* args, ** kwargs): print ('hello') function (* args, ** kwargs) print ('welcome to edureka') return wrapper @ function1 def function2 (nom): print (f '{nom}') function2 ('pythonista')
 Production: bonjour pythonista bienvenue à edureka

Renvoi de valeurs à partir de fonctions décorées

Jetons un œil à un exemple pour voir comment nous pouvons renvoyer une valeur à partir d'une fonction décorée.

def function1 (function): def wrapper (* args, ** kwargs): function (* args, ** kwargs) print ('ça a marché') return wrapper @ function1 def function2 (name): print (f '{name} ') fonction2 (' python ')
 Production: python ça a marché

Assurez-vous de renvoyer votre fonction wrapper avec des arguments pour éviter toute erreur.

Décorateurs Fantaisie En Python

Maintenant que nous savons comment les décorateurs fonctionnent en python, explorons une fonctionnalité assez complexe à l'aide de quelques exemples.

Décorateurs de classe

Il existe deux façons de décorer une classe en python. Le premier est l'endroit où vous pouvez décorer les méthodes à l'intérieur d'une classe, il existe des décorateurs intégrés tels que @classmethod, @staticmethod et @property en python. @classmethod et @staticmethod définissent des méthodes à l'intérieur d'une classe qui n'est connectée à aucune autre instance d'une classe. @property est normalement utilisé pour personnaliser les getters et les setters d'un attribut de classe. Jetons un œil à un exemple pour comprendre cela.

class Carré: def __init __ (self, side): self._side = side @property def side (self): return self._side @ side.setter def side (self, value): if value & gt = 0: self._side = value else: print ('error') @property def area (self): return self._side ** 2 @classmethod def unit_square (cls): return cls (1) s = Square (5) print (s.side) print (s.area)
 Production: 5 25

Une autre façon de décorer la classe est de décorer toute la classe. Prenons un exemple pour comprendre cela.

from dataclasses import dataclass @dataclass class Cartes: rang: str costume: str

La décoration d'une classe ne reflète pas ses méthodes. C'est presque similaire à l'écriture d'un décorateur d'une fonction, la seule différence est la classe dans l'argument au lieu d'une fonction.

Classe Singleton

Une classe singleton n'a qu'une seule instance. Il y a beaucoup de singletons en python, y compris True, None, etc. Jetons un coup d'œil à un exemple pour mieux comprendre cela.

import functools def singleton (cls): @ functools.wraps (cls) def wrapper (* args, ** kwargs): sinon wrapper.instance: wrapper.instance = cls (* args, ** kwargs) renvoie wrapper.instance wrapper .instance = None return wrapper @singleton class One: pass first = One () second = One () print (first is second)
 Production: Vrai

L’utilisation de ‘est’ ne renvoie vrai que pour les objets de la même instance. L'exemple ci-dessus utilise la même approche que tout autre décorateur de fonction. La seule différence est que nous avons utilisé cls au lieu de function. En outre, le premier et le second sont exactement la même instance.

Décorateurs de nidification

Vous pouvez utiliser plusieurs décorateurs en les empilant les uns sur les autres. Prenons un exemple pour comprendre comment cela fonctionne.

@ function1 @ function2 def fonction (nom): print (f '{nom}')

C'est ainsi que nous pouvons utiliser des décorateurs imbriqués en les empilant les uns sur les autres. Dans l'exemple ci-dessus, il ne s'agit que d'une simple représentation, pour que cela fonctionne, vous devrez définir function1 et function2 avec des fonctions wrapper à l'intérieur de chacune d'elles.

Arguments chez un décorateur

Il est toujours utile de passer des arguments dans un décorateur. Prenons l'exemple suivant.

message contextuel de script java
import functools def repeat (num): def decorator_repeat (func): @ functools.wraps (func) def wrapper (* args, ** kwargs): for _ in range (num): value = func (* args, ** kwargs) ) return value return wrapper return decorator_repeat @repeat (num = 4) def function (name): print (f '{name}') function ('python')
 Production: python python python python

Cela nous amène à la fin de cet article où nous avons appris comment utiliser Decorator en Python avec des exemples. J'espère que vous êtes clair avec tout ce qui a été partagé avec vous dans ce tutoriel de décorateur Python

Si vous avez trouvé cet article sur «Python Decorator Tutorial» pertinent, consultez le une entreprise d'apprentissage en ligne de confiance avec un réseau de plus de 250 000 apprenants satisfaits répartis dans le monde entier.

Nous sommes là pour vous aider à chaque étape de votre voyage et proposer un programme conçu pour les étudiants et les professionnels qui souhaitent devenir . Le cours est conçu pour vous donner une longueur d'avance dans la programmation Python et vous former aux concepts Python de base et avancés ainsi que divers comme

Si vous rencontrez des questions, n'hésitez pas à poser toutes vos questions dans la section commentaires du «Tutoriel de décorateur Python» et notre équipe se fera un plaisir de vous répondre.