Каковы мнения народов об использовании __call__
. Я только очень редко видел, что это использовало, но я думаю, что это - очень удобный инструмент для использования, когда Вы знаете, что класс будет используемым для некоторого поведения по умолчанию.
Думаю, ваша интуиция примерно права.
Исторически вызываемые объекты (или то, что я иногда слышал, называемые «функторами») использовались в объектно-ориентированном мире для имитации замыканий. В C ++ они часто незаменимы.
Однако __ call __
имеет немало конкурентов в мире Python:
Я бы сказал, что время использовать __ call __
- это когда вам не лучше использовать один из вариантов выше. Возможно, проверьте следующие критерии:
run ()
или doStuff ()
или go ()
или всегда популярный и постоянно повторяющийся doRun ()
, у вас может быть кандидат. Один из примеров, который мне нравится, - это командные объекты пользовательского интерфейса. Разработанный таким образом, что их основная задача - выполнить команду, но с дополнительными методами для управления их отображением, например, в качестве пункта меню, мне кажется, что это то, для чего вам все еще нужен вызываемый объект.
В общем, Python имеет много методов с двойным подчеркиванием. Они существуют по какой-то причине: они представляют собой способ перегрузки операторов в Python. Например, если вам нужен новый класс, в котором дополнение, я не знаю, печатает «foo»
, вы определяете методы __ add __
и __ radd __
. В этом нет ничего изначально хорошего или плохого, как и ничего хорошего или плохого в использовании для
циклов.
Фактически, использование __ call __
часто является более питоновским подходом, поскольку способствует ясности кода. Например, вы можете заменить MyCalculator.calculateValues (foo)
на MyCalculator (foo)
.
Обычно он используется, когда класс используется как функция с некоторым контекстом экземпляра, например, некоторый DecoratorClass, который будет использоваться как @DecoratorClass ('some param')
, поэтому 'some param' будет сохранен в пространство имен экземпляра, а затем экземпляр вызывается как фактический декоратор.
Это не очень полезно, когда ваш класс предоставляет несколько различных методов, поскольку обычно неочевидно, что будет делать вызов, а явное лучше, чем неявное в этих случаях.
Используйте его, если вам нужно, чтобы ваши объекты были вызываемыми, для этого он и существует
Я не уверен, что вы подразумеваете под поведением по умолчанию
Одно место, где я нашел его особенно полезным, это использование обертки или чего-то подобного, где объект вызывается глубоко внутри какого-то фреймворка/библиотеки.