web-dev-qa-db-fra.com

Comment appelez-vous une instance d'une classe en Python?

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?

22
Aaron Hall

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!

43
Aaron Hall