Maison  >  Questions et réponses  >  le corps du texte

python - Utiliser __call__ pour implémenter des fonctions de décorateur

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

某草草某草草2640 Il y a quelques jours794

répondre à tous(1)je répondrai

  • 迷茫

    迷茫2017-06-28 09:26:02

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

    répondre
    0
  • Annulerrépondre