a () et a .__ call__ () ne sont pas équivalents

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

référence

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

Recommended Posts

a () et a .__ call__ () ne sont pas équivalents
Python a + = b et a = a + b sont différents
[Python3] "A // B" et "math.floor (A / B)" ne sont pas toujours les mêmes! ??
python memo- "sinon A et B" était "si (pas A) et B"
Une note sur __call__
Une solution au problème que les fichiers contenant [et] ne sont pas répertoriés dans glob.glob ()
Les arguments par défaut de Python ne sont pas initialisés à chaque appel
Impossible d'utiliser les commandes python et pip sur CentOS (RHEL) 8
Comment appeler une fonction
Lire et écrire des fichiers
La liste Python n'est pas une liste
Notation A1 et nombre 26-aires
Écrire et lire des fichiers
Qu'est-ce qu'un appel système
Différence entre ps a et ps -a
l'expression régulière de python, str et unicode sont sobres et addictives
Téléchargez et gérez les packages qui ne sont pas dans conda sur anaconda.org