Comme le titre l'indique, je ne le savais pas, alors j'ai pris une note pour moi-même.
Si vous essayez de remplacer ʻa .__ call __ () ʻ et ʻa () , vous pouvez voir qu'ils ont en fait un comportement __ différent __. Il semble que ʻa ()
appelletype (a) .__ appelle __ (a)
pour être exact.
python
>>> class A(object):
... def __init__(self):
... print 'init of A'
...
... def __call__(self):
... print 'call of A'
...
... def method(self):
... print 'method of A'
...
Définissez __init__
, __call__
, method
dans la classe A.
Puisque method est une fonction membre ordinaire, vous pouvez remplacer la méthode en définissant ʻa.method = hoge`.
python
#Vérifiez le traitement lors de l'appel normal
>>> a = A()
init of A
>>> a.method()
method of A
>>> a()
call of A
# a.Essayez la méthode d'écrasement
>>> a.method = lambda: 'overriding method'
>>> a.method()
'overriding method'
# a.__call__Écraser de la même manière
>>> a.__call__ = lambda: 'overriding call'
# a.__call__()Est certainement dépassé
>>> a.__call__()
'overriding call'
# a()Ça ne marche pas
>>> a()
call of A
>>> type(a).__call__(a)
call of A
# type(a).__call__Écraser de force
>>> type(a).__call__ = lambda a: 'new __call__'
>>> type(a).__call__(a)
'new __call__'
#A bien fonctionné
>>> a()
'new __call__'
http://www.rakunet.org/tsnet/TSpython/43/1292.html
Recommended Posts