Utilisez le __call__ d'une classe pour implémenter un décorateur, comme indiqué dans le code suivant
class Check(object):
def __init__(self, name):
self.name = name
def __call__(self, func):
print "1111111111"
def _decorator(*args, **kwargs):
print "2222222222"
return func(*args, **kwargs)
Si vous utilisez cette classe comme décorateur pour décorer une réception.
@Check("param")
def param_check(request):
"python code....."
return Response("ok")
Voici le problème. Démarrez un Django ou tout autre processus Python. Lors de l'exécution de cette route param_check, print "1111111111" n'est imprimé que pour la première fois, et 1111111111111 n'est pas imprimé lorsqu'il est appelé ultérieurement.
Et l'impression "2222222222" est imprimée à chaque fois. Je crois comprendre que __call__ définit ce décorateur pour la première fois, il n'est donc exécuté qu'une seule fois. Il a été défini lorsqu'il est demandé à nouveau plus tard, et seule la partie du corps de la fonction est exécutée, qui est la partie print 222222222. Qui connaît les fonctionnalités de ce décorateur python
En fait, il y a quelque chose à noter lors de l'utilisation de décorateurs de classe. Les décorateurs de classe avec et sans paramètres sont en fait différents
.Décorateur de classe sans paramètres
Si vous créez un décorateur sans paramètres, la méthode décorée sera transmise au constructeur du décorateur (__init__), puis lorsque la fonction décorée sera appelée, la méthode __call__() du décorateur sera exécutée.
Il est à noter que lors de la phase de décoration, la fonction __init__ est exécutée, et lorsque la méthode décorée est appelée, __call__ est exécutée.
Décorateur de classe avec paramètres
Sortie :
On voit clairement que __call__ ne sera appelé qu'une seule fois pendant la phase de décoration
Si vous souhaitez en savoir plus, veuillez consulter ici : http://www.artima.com/weblogs...