Javascript использует модель на основе прототипа для своих объектов.Тем не менее, язык очень гибкий, и в несколько строк легко написать функции, которые заменяют другие виды конструкций.Например, можно создать функцию class
, эмулирующую стандартное поведение класса, включая наследование или закрытые члены.Или можно имитировать функциональные инструменты, написав, например, функцию curry
, которая будет принимать функцию и некоторые ее аргументы и возвращать частично примененную функцию.
Мне было интересно, возможно ли сделатьповернуть вспять и подражать прототипу в более классических языках.В частности, я немного подумал, возможно ли имитировать прототипы в Python, но отсутствие поддержки анонимных функций (более общих, чем лямбда-выражения) застревает.
Можно ли написатьнекоторые функции для имитации пропотипов в языках классов, в частности в Python?
EDIT Позвольте мне привести пример того, как можно реализовать такую вещь (но яя на самом деле не в состоянии сделать все это).
Во-первых, то, что больше всего напоминает объекты Javascript, это словарь Python.Таким образом, мы могли бы иметь простые объекты, такие как
foo = {
'bar': 1,
'foobar': 2
}
Конечно, мы хотим добавить метод, и это не проблема, если метод помещается в лямбду
foo = {
'bar': 1,
'foobar': 2,
'method': lambda x: x**2
}
Так что теперьмы можем вызвать, например,
foo['method'](2)
>>> 4
Теперь , если , у нас были произвольные функции в качестве методов, которые мы могли бы продолжать следующим образом.Сначала нам нужно, чтобы функции внутри foo
имели доступ к самому foo
;в противном случае это просто обычные функции, а не методы.
Полагаю, можно сделать это, применив функцию makeObject
к foo
, которая перебирает значения foo
и всякий раз, когда находит вызываемое значение, изменяет свой атрибут __call__
, передавая foo
в качестве первого аргумента.
На этом этапе у нас будут автономные объекты, которые могут быть объявлены без необходимости создания классов.
Затем нам нужно предоставить foo
прототип, который можно передать в качестве второго аргумента функции makeObject
.Функция должна изменить foo.__getattr__
и foo.__setattr__
следующим образом: всякий раз, когда атрибут не найден в foo
, его следует искать в foo.prototype
.
Так что, я думаю, я смогу реализоватьэто ожидаемо с одной стороны: я не могу придумать способов объявить методы более сложными, чем лямбды, кроме как объявить их заранее и прикрепить к моему объекту.Проблема заключается в отсутствии анонимных функций.Я спросил здесь, потому что, возможно, какой-то гуру Python мог бы найти какой-нибудь умный способ обойти это.