Wie der Titel schon sagt, wusste ich es nicht und machte mir eine Notiz.
Wenn Sie versuchen, "a .__ call__ ()" und "a ()" zu überschreiben, können Sie feststellen, dass sie tatsächlich ein anderes __ Verhalten __ haben.
Es scheint, dass a ()
AnrufeTyp (a) .__ Aufruf __ (a)
um genau zu sein.
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'
...
Definieren Sie in der Klasse A "init", "call", "method". Da method eine gewöhnliche Elementfunktion ist, können Sie die Methode überschreiben, indem Sie "a.method = hoge" setzen.
python
#Überprüfen Sie die Verarbeitung, wenn Sie normal anrufen
>>> a = A()
init of A
>>> a.method()
method of A
>>> a()
call of A
# a.Versuchen Sie, die Methode zu überschreiben
>>> a.method = lambda: 'overriding method'
>>> a.method()
'overriding method'
# a.__call__Auf die gleiche Weise überschreiben
>>> a.__call__ = lambda: 'overriding call'
# a.__call__()Wird sicherlich überschrieben
>>> a.__call__()
'overriding call'
# a()Es funktioniert nicht
>>> a()
call of A
>>> type(a).__call__(a)
call of A
# type(a).__call__Zwangsüberschreiben
>>> type(a).__call__ = lambda a: 'new __call__'
>>> type(a).__call__(a)
'new __call__'
#Gut gearbeitet
>>> a()
'new __call__'
http://www.rakunet.org/tsnet/TSpython/43/1292.html
Recommended Posts