Вызов метода перехвата Python - PullRequest
2 голосов
/ 16 марта 2012

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

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

1 Ответ

0 голосов
/ 16 марта 2012

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

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

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

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

Извините за текст и большинство презентаций на португальском языке.

...