Прототипное программирование на Python

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 найдет какой-нибудь умный способ обойти это. 2) Кроме того, есть ли способ узнать, использует ли БД какой-либо другой процесс?.

1) Есть ли прагма или какой-либо способ узнать текущее состояние блокировки sqlite db?.
2) Кроме того, есть ли способ узнать, использует ли БД какой-либо другой процесс?.

5
задан asdfg 7 January 2011 в 19:04
поделиться