Я использую Python 2.7.2. Я хочу понять взаимосвязь между вызовом функции и вызовом атрибута __call__ функции. Например, рассмотрим следующий код
def foo():
return 5
print foo() # ==> 5
print foo.__call__() # ==> 5
foo.__call__ = lambda : 6
print foo() # ==> 5
print foo.__call__() # ==> 6
Кажется, что первые четыре строки указывают, что вызов функции foo совпадает с вызовом атрибута __call__ foo. Тем не менее, последние три строки, похоже, указывают на то, что они разные звери, поскольку я изменил атрибут __call__, но не изменил значение, возвращаемое вызовом foo().
Может ли кто-нибудь объяснить связь между вызовом foo() и вызовом foo.__call__()? Есть ли способ изменить поведение функции, так что foo(), а также foo.__call__() теперь возвращает 6 вместо 5?