Я ищу способ узнать, когда был получен доступ к объекту 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
Есть ли лучший способ зафиксировать какие-либо взаимодействия с моим объектом? Или я что-то упустил для этого подхода?
Спасибо.