2012-03-16 4 views
2

Позвольте мне начать с того, что я хотел бы сделать. Я хочу создать ленивую оболочку для переменной, так как я записываю все вызовы методов и вызовы операторов и оцениваю их позже, когда я указываю переменную, чтобы вызвать ее.Метод перехвата Python call

Как таковой, я хочу иметь возможность перехватывать все вызовы методов и вызовы операторов и специальные методы, чтобы я мог работать с ними. Однако __getattr__ не перехватывает вызовы операторов или __str__ и такие, поэтому я хочу знать, существует ли общий способ перегрузить все вызовы методов или просто я просто динамически создаю класс и дублирую код для всего этого (что я уже сделал, но уродливо).

+1

Я написал ответ на [этот вопрос] (http://stackoverflow.com/questions/9057669/how-can-i-intercept-calls-to-pythons-magic-methods-in-new-style-classes/9059858 # 9059858), который похож на то, что вы хотите сделать. – kindall

+0

Даже '__getattribute__' вызывается в методах dunder. Убирайся. –

ответ

0

Это можно сделать, но да, это становится «уродливым» - однажды я написал ленивого декоратора, который превращает любую функцию в «лениво вычисляемую функцию».

В принципе, я узнал, что единственный момент, когда значение объекта фактически используется в Python, - это когда один из специальных методов «dunder» вызван. Например, когда у вас есть номер, это значение используется только тогда, когда вы используете его в другой операции или преобразуете его в строку для ввода-вывода (которая также использует метод «dunder»)

Итак, моя обертка анотирует параметры вызову функции и возвращает специальный объект, , который имеет потенциально все методы «dunder». Когда вызывается один из этих методов, вызывается исходная функция - и ее возвращаемое значение затем кэшируется для дальнейшего использования.

Реализация здесь: https://bitbucket.org/jsbueno/metapython/src/510a7d125b24/lazy_decorator.py

К сожалению для текста и большую часть презентации будучи на португальском языке.

+0

Вы правы, '__getattribute__' не вызывается для методов dunder. –