Ceci est inspiré par une question que je viens de voir, "Changer ce qui est retourné en appelant une instance de classe", mais a été rapidement répondu par __repr__
(et accepté, donc l'intervenant n'avait pas réellement l'intention d'appeler l'instance).
Maintenant, appeler une instance d'une classe peut se faire comme ceci:
instance_of_object = object()
instance_of_object()
mais nous obtiendrons une erreur, quelque chose comme TypeError: 'object' object is not callable
.
Ce comportement est défini dans le CPython source ici.
Donc, pour nous assurer que nous avons cette question sur Stackoverflow:
Comment appelez-vous réellement une instance d'une classe en Python?
Vous appelez une instance d'une classe comme suit:
o = object() # create our instance
o() # call the instance
Mais cela nous donnera généralement une erreur.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'object' object is not callable
Comment pouvons-nous appeler l'instance comme prévu, et peut-être en tirer quelque chose d'utile?
Nous devons implémenter Python méthode spéciale, __call__
!
class Knight(object):
def __call__(self, foo, bar, baz=None):
print(foo)
print(bar)
print(bar)
print(bar)
print(baz)
Instancier la classe:
a_knight = Knight()
Maintenant, nous pouvons appeler l'instance de classe:
a_knight('ni!', 'ichi', 'pitang-zoom-boing!')
qui imprime:
ni!
ichi
ichi
ichi
pitang-zoom-boing!
Et nous avons maintenant en fait, et avec succès, appelé une instance de la classe!