Когда использует __ вызов __ хорошая идея?

Каковы мнения народов об использовании __call__. Я только очень редко видел, что это использовало, но я думаю, что это - очень удобный инструмент для использования, когда Вы знаете, что класс будет используемым для некоторого поведения по умолчанию.

17
задан Tim McNamara 30 July 2010 в 08:02
поделиться

4 ответа

Думаю, ваша интуиция примерно права.

Исторически вызываемые объекты (или то, что я иногда слышал, называемые «функторами») использовались в объектно-ориентированном мире для имитации замыканий. В C ++ они часто незаменимы.

Однако __ call __ имеет немало конкурентов в мире Python:

  • Обычный именованный метод, поведение которого иногда гораздо легче определить по имени. Может преобразовываться в связанный метод, который можно вызывать как функцию.
  • Замыкание, полученное путем возврата функции, определенной во вложенном блоке.
  • Лямбда - ограниченный, но быстрый способ закрытия.
  • Генераторы и сопрограммы, тела которых хранят накопленное состояние так же, как функтор.

Я бы сказал, что время использовать __ call __ - это когда вам не лучше использовать один из вариантов выше. Возможно, проверьте следующие критерии:

  • Ваш объект имеет состояние.
  • У вашего класса есть явное «первичное» поведение, которое глупо называть. Например. если вы обнаружите, что пишете run () или doStuff () или go () или всегда популярный и постоянно повторяющийся doRun () , у вас может быть кандидат.
  • Состояние вашего объекта превышает то, что можно было бы ожидать от функции генератора.
  • Ваш объект оборачивает, имитирует или абстрагирует концепцию функции.
  • У вашего объекта есть другие вспомогательные методы, которые концептуально относятся к вашему основному поведению.

Один из примеров, который мне нравится, - это командные объекты пользовательского интерфейса. Разработанный таким образом, что их основная задача - выполнить команду, но с дополнительными методами для управления их отображением, например, в качестве пункта меню, мне кажется, что это то, для чего вам все еще нужен вызываемый объект.

19
ответ дан 30 November 2019 в 13:20
поделиться

В общем, Python имеет много методов с двойным подчеркиванием. Они существуют по какой-то причине: они представляют собой способ перегрузки операторов в Python. Например, если вам нужен новый класс, в котором дополнение, я не знаю, печатает «foo» , вы определяете методы __ add __ и __ radd __ . В этом нет ничего изначально хорошего или плохого, как и ничего хорошего или плохого в использовании для циклов.

Фактически, использование __ call __ часто является более питоновским подходом, поскольку способствует ясности кода. Например, вы можете заменить MyCalculator.calculateValues ​​(foo) на MyCalculator (foo) .

1
ответ дан 30 November 2019 в 13:20
поделиться

Обычно он используется, когда класс используется как функция с некоторым контекстом экземпляра, например, некоторый DecoratorClass, который будет использоваться как @DecoratorClass ('some param') , поэтому 'some param' будет сохранен в пространство имен экземпляра, а затем экземпляр вызывается как фактический декоратор.

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

0
ответ дан 30 November 2019 в 13:20
поделиться

Используйте его, если вам нужно, чтобы ваши объекты были вызываемыми, для этого он и существует

Я не уверен, что вы подразумеваете под поведением по умолчанию

Одно место, где я нашел его особенно полезным, это использование обертки или чего-то подобного, где объект вызывается глубоко внутри какого-то фреймворка/библиотеки.

4
ответ дан 30 November 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: