(Python) Захват любых взаимодействий с объектом - PullRequest
1 голос
/ 16 января 2020

Я ищу способ узнать, когда был получен доступ к объекту str. Я хочу знать, когда его значение использовалось другими переменными или функциями в моем коде, например, когда оно использовалось int, float, len, print или когда оно использовалось для дополнений result = my_var + 'something'.

Мой первоначальный подход состоял в том, чтобы создать класс Decorator, расширяющий str , и использовать функцию decorator, чтобы сообщить мне, когда был получен доступ к любому из его методов. Хотя этот подход прекрасно работает для print и my_var + 'something', он не уведомляет меня, например, когда я использую свой объект во встроенной функции int.

Мой подход:

def delegate_all():
    def decorate(cls):
        for attr in str.__dict__:
            if callable(getattr(str, attr)) and attr not in ['__init__', '__new__']:
                setattr(cls, attr,
                    lambda self, *args, **kwargs:
                        do_action(self, cls, attr, '_string_value', attr, *args, **kwargs))

        return cls
    return decorate

Функция do_action - это то, где я динамически устанавливаю поле accessed в своем объекте, а затем перенаправляю вызов метода в мой фактический экземпляр строки в моем объекте.

И затем создаю класс AccessWrapper:

@delegate_all()
class AccessWrapper(str):
    def __init__(self, value):
        self._string_value = value
        self.__accessed = False

Есть ли лучший способ зафиксировать какие-либо взаимодействия с моим объектом? Или я что-то упустил для этого подхода?

Спасибо.

...