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

藏色散人
Libérer: 2019-07-04 10:51:00
original
8594 Les gens l'ont consulté

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

Tout d'abord, qu'est-ce qu'un décorateur ?

L'explication la plus officielle est la suivante :

Un décorateur est un objet appelable utilisé pour gérer et appeler des fonctions et des classes, ce qui signifie qu'il est divisé en décorateurs de fonctions et décorateurs de classes

J'ai un peu simplifié cette fonction de définition, sinon elle sera encore plus difficile à comprendre. En fait, j'ai une phrase plus générale qui peut expliquer le décorateur :

Le décorateur doit décorer l'objet. (Fonction, classe) est refactorisée, et elle peut exécuter le comportement refactorisé lors de l'appel de l'objet sans changer l'objet d'origine

Vous pouvez être confus ici et ne pas comprendre

C'est bon, prenons notre temps! ! !

Tout d'abord, vous devez connaître la syntaxe du décorateur

def decorator(f):
    def wrapper(x,y):
        return x+y
    return wrapper
@decorator
def func(x,y):
    return 1
func(3,4)
Copier après la connexion

Ensuite, regardez ce code, vous pourriez avoir quelques questions basées sur ce qui précède :

1. Que signifie décorateur ?

2. Quel est le comportement de la reconstruction ici ?

3. À quoi ressemble l’ensemble du comportement ou du processus de décoration ?

Regardons le code ci-dessus. Évidemment, nous avons dit que le décorateur est un objet appelable. Ce n'est pas un problème. Le décorateur ci-dessus est une fonction.

Quel est le comportement du refactoring ?

Le comportement de refactorisation du code ci-dessus consiste à remplacer le code d'exécution de func par le code d'exécution du wrapper En d'autres termes, l'entrée finale du code est 7 au lieu de 1.

En fait, les deux questions ci-dessus sont absurdes. Après avoir résolu la troisième question, nous l'avons naturellement compris !

D'accord, avant de continuer la lecture, retenons une phrase :

Le décorateur lui-même accepte l'objet décoré, et l'objet appelable renvoyé par le décorateur accepte tous les paramètres de l'objet décoré

Assurez-vous de lire attentivement cette phrase, de la comprendre et de la retenir !

Dans le code ci-dessus, le

décorateur est : decorator

L'objet appelable renvoyé est : wrapper

L'objet décoré est : func

D'accord, vous devez d'abord faire cela et jeter un œil au flux d'exécution de cette fonction

Bien sûr, vous aurez encore une question à ce moment-là :

Lors de l'appel de func Que s'est-il passé en (3,4) ?

À ce moment : l'objet appelable renvoyé (wrapper) est donné à func Vous pouvez également comprendre que le code actuel de func est

def func(x,y):
    return x+y
Copier après la connexion

À ce moment, func n'est pas défini par lui-même. du tout func, a-t-il été reconstruit dans un sens ?

À ce stade, comprenez-vous ce qu'est un décorateur ? Vous devriez !

Mais nous n’avons pas encore fini, car je souhaite vous faire comprendre en profondeur ce qu’est un décorateur !

Nous avons déjà dit qu'il n'y avait pas que des décorateurs de fonctions, mais aussi des décorateurs de classe. Voyons ensuite comment fonctionnent les décorateurs de classe. Je souhaite quand même publier le paragraphe précédent ici.

Le décorateur lui-même accepte l'objet décoré, et l'objet appelable renvoyé par le décorateur accepte tous les paramètres de l'objet décoré

class Decorator:
    def __init__(self,f):
        self.func = f
    def __call__(self,x,y):
        return self.func(x,y) + 1
@Decorator
def func(x,y):
    return x+y
func(3,4)
# 你来想想这时候的结果是什么?
Copier après la connexion

Analysons-le étape par étape,

Tout d'abord de tout, on dit que le décorateur n'accepte que l'objet décoré comme paramètre, ce qui veut dire qu'à ce moment il y a

Decorator(func)
 # 这段代码对应着第一句话
 # 接下来是
 func(3,4)
 # 这句话是不是触动了__call__方法
 # 接下来就是第二句话:返回的可调用对象接受被装饰对象的所有参数
 # 所以3,4就被传递给了__call__方法
 # 此时的func是什么
 return self.func(x,y) + 1
 # 也就是说结果为8,而不是7
Copier après la connexion

Regardons quelque chose de difficile :

def decorator(f):
    def wrapper(self,x,y):
        return self.name + x + y
    return wrapper
class C:
    name = '土'
    @decorator
    def method(x,y):
        return x + y
ins = C()
myname = ins.method('行','孙')
Copier après la connexion

Pensez à quoi la réponse est ?

Si vous y réfléchissez bien, vous comprenez en gros ce qu'est un décorateur !

Recommandations associées : "Tutoriel Python"

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal