[PYTHON] a () und a .__ call__ () sind nicht gleichwertig

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__'

Referenz

http://www.rakunet.org/tsnet/TSpython/43/1292.html

Recommended Posts

a () und a .__ call__ () sind nicht gleichwertig
Python a + = b und a = a + b sind unterschiedlich
[Python3] "A // B" und "math.floor (A / B)" sind nicht immer gleich! ??
Python-Memo- "wenn nicht A und B" war "wenn (nicht A) und B"
Ein Hinweis zu __call__
Eine Lösung für das Problem, dass Dateien mit [und] nicht in glob.glob () aufgeführt sind
Python-Standardargumente werden nicht bei jedem Aufruf initialisiert
Unter CentOS (RHEL) 8 können keine Python- und Pip-Befehle verwendet werden
So rufen Sie eine Funktion auf
Dateien lesen und schreiben
A1-Notation und 26-stellige Nummer
Dateien schreiben und lesen
Was ist ein Systemaufruf?
Unterschied zwischen ps a und ps -a
Pythons regulärer Ausdruck, str und unicode sind nüchtern
Laden Sie Pakete, die sich nicht in Conda befinden, auf anaconda.org hoch und verwalten Sie sie