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