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)
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
À 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) # 你来想想这时候的结果是什么?
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
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('行','孙')
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!