Я не понимаю, что вы подразумеваете под "эквивалентом ... используя объектно-ориентированный подход".В Python, поскольку функции (как вы говорите) являются объектами первого класса, как это не «объектно-ориентировано» передавать функции в качестве аргументов?
стандартным способом достижения этого в языке, гдефункции не являются объектами первого класса?
Только в том случае, если существует стандартный способ, которым функции не могут быть объектами первого класса, я бы сказал.
В C ++,Обычно создается другой класс, часто называемый functor или functionoid , который определяет перегрузку для operator()
, позволяя использовать экземпляры как функции синтаксически.Тем не менее, также часто можно обойтись с простыми старыми указателями на функции.Ни указатель, ни указанная функция не являются первоклассным объектом, но интерфейс достаточно богат.
Это хорошо согласуется с "специальным полиморфизмом", достигаемым с помощью шаблонов;вы можете писать функции, которым на самом деле все равно, передаете ли вы экземпляр класса или указатель на функцию.
Аналогично, в Python вы можете сделать так, чтобы объекты регистрировались как callable
, определяя метод __call__
для класса.
Считают ли блоки, как в smalltalk или target-C, как функции в этом отношении?
Я бы сказал, что они это делают.По крайней мере, столько же, сколько лямбд, считаются функциями в Python, и даже больше, потому что они не повреждены, как лямбды в Python.
Будут ли блоки лучшим способом сделать это на этих языках?
Это зависит от того, что вам нужно.
Не могли бы вы добавить новый метод во время выполнения?На каких языках это было бы возможно (и легко)?
Языки, которые предлагают самоанализ и доступ во время выполнения к своему собственному компилятору.Python отвечает требованиям.
Однако в этой проблеме нет ничего, как было представлено выше, что предполагает необходимость для перехода через такие обручи.Конечно, в некоторых языках для нового класса требуется больше шаблонного шаблона, чем в других.
Или лучше создать объект с помощью одного метода, выполняющего нужную операцию?
Это довольно стандартно.
Что если бы я хотел передать много функций, я бы создал много одноэлементных объектов?
Вы говорите это так, как будто вы можете каким-то образом случайно создать более одного экземпляра класса, если не будете писать тонны шаблонного кода, пытаясь помешать себе.
Будет ли это рассматриваться как более объектно-ориентированный подход?
Опять же, я не могу понять ваше понимание термина "объектно-ориентированный".Это не означает «создание множества объектов».
Кто-нибудь подумал бы сделать это на python, где функции являются объектами первого класса?
Не без необходимостидополнительные вещи, которые класс может делать, а функция - нет.С утки печатать, с какой стати вы беспокоитесь?