Python >> Tutoriel Python >  >> Python

Méthode magique Python __call__()

Syntaxe

object.__call__(self[, args...])

Le Python __call__ rend une classe appelable, vous pouvez donc appeler des objets de la classe comme une fonction normale. Par exemple, si vous définissez __call__(self) sur un objet x de classe X , vous pouvez l'appeler ainsi :x() . La valeur de retour de l'objet appelé est la valeur de retour du __call__() méthode.

Nous appelons cela une "méthode Dunder" pour "D ouble Sous Méthode de score" (également appelée "méthode magique" ). Pour obtenir une liste de toutes les méthodes de dunder avec des explications, consultez notre article sur la feuille de triche de dunder sur ce blog.

💡 Remarque :Formellement, en appelant x(arg1, arg2, ...) se traduit par type(x).__call__(x, arg1, ...) alors que le type() la fonction intégrée détermine la classe (type) de x .

Exemple minimal __appel__

L'extrait de code suivant permet d'appeler une classe personnalisée Person en fournissant une implémentation de la méthode magique __call__() qui prend deux arguments :

  • self – une référence à l'objet lui-même. Ceci est automatiquement transmis à la fonction par Python - vous n'avez pas besoin de fournir l'argument vous-même.
  • other – un argument supplémentaire (par exemple, une chaîne) pour fournir un message d'accueil personnalisé.

Avec cette implémentation, nous pouvons maintenant créer un objet appelable alice et appelez-le comme suit :alice() .

class Person:
    def __call__(self, other):
        return f'Hi {other}'


alice = Person()
print(alice('Bob'))
# Hi Bob

Appel en arrière-plan

callable(object) intégré de Python renvoie True si vous pouviez appeler le object argument comme une fonction avec les parenthèses finales dans object() .

Vous pouvez rendre n'importe quel objet appelable en implémentant le __call__() de l'instance méthode.

Par exemple, callable(callable) renvoie True car callable est un objet fonction. Mais callable(3) renvoie False car un entier n'est pas une fonction que vous pouvez appeler.

>>> callable(callable)
True
>>> callable(3)
False

Vous pouvez en savoir plus sur la fonction dans notre guide de blog détaillé :

  • Python callable() Analyse approfondie

Références :

  • https://docs.python.org/3/reference/datamodel.html