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