python - Utiliser __call__ pour implémenter des fonctions de décorateur
某草草
某草草 2017-06-28 09:24:02
0
1
865

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

某草草
某草草

répondre à tous(1)
迷茫

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.

class Check(object):

    def __init__(self, func):
        self.func = func

    def __call__(self, *args):

        print("111111")
        self.func(*args)
        print("222222")

@Check
def param_check(request):
    print(request)



param_check('hello')
param_check('world')
111111
hello
222222
111111
world
222222

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

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)
        return decorator

@Check('parm')
def param_check():
    print('Hello')

param_check()
param_check()

Sortie :

1111111111
2222222222
Hello
2222222222
Hello

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...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal