Функции Python и их атрибут __call__ - PullRequest
11 голосов
/ 14 марта 2012

Я использую 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?

1 Ответ

11 голосов
/ 14 марта 2012

Я рекомендую прочитать поиск специальных методов для классов нового стиля (особенно последний абзац).

Для классов нового стиля неявные вызовы специальных методов разрешены толькогарантированно работает правильно, если определено для типа объекта, а не в словаре экземпляра объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...