В моем проекте я должен придерживаться Python 2.5 (Google App Engine). Где-то в приложении (на самом деле фреймворк) я должен отслеживать, какие переменные определены и в каком порядке они определены, другими словами, я хотел бы перехватывать всякий раз, когда обрабатывается оператор присваивания.Есть ли способ эмулировать специальный метод __prepare__ для 3-метакласса Python в Python 2.5?
Используя Python 3, я бы определил метакласс M с методом __prepare__
, который возвращает интеллектуальный словарь, который отслеживает, когда к нему обращаются. Затем мне просто нужно выполнить все внутри инструкции класса с метакласом M.
Есть ли способ подражать этому в Python 2.5?
Пример того, что я хотел бы достичь
С метаклассом подхода Python 3, я мог бы реализовать переменные, которые работают как ссылки, например, M может быть так, что
# y is a callable
class C(metaclass=M):
x = ref(y)
x = 1
бы быть эквивалентным (вплоть до создания C) с y(1)
, то есть первое присвоение переменной в словаре C черным ящиком ref
создает эту переменную. Дальнейшие назначения просто вызывают параметр ref ref.
Я немного смущен. Вы хотите только выполнить назначения в инструкции класса, чтобы отслеживать порядок или действительно хотите получить полученный класс? – aaronasterling
@Aaron: Меня интересует только то, как заполняется словарь, а не в результате создания соответствующего класса. Используя специальный метод __new__, я могу даже пропустить создание результирующего класса, который уже работает в Python 2.5. Однако я мог бы использовать __new__, чтобы сообщить о моем словаре (в случае, если он создан в __prepare__). Классы метакласса M тогда будут словарями, а не классами. – Marc
- это распоряжение об изгнании нашего? Я действительно не могу придумать способ сделать это, хотя это интересный вопрос. – aaronasterling