Реализация прокси-объектов
Python
Senior
Яндекс
Как реализовать прозрачный прокси-объект, который делегирует все атрибуты другому объекту, но при этом может логировать доступ? Покажите базовый пример.
Ответы
Прокси через __getattr__
Простейший способ — хранить целевой объект внутри и переопределить `__getattr__` и, при необходимости, `__setattr__`:
```python
class Proxy:
def __init__(self, target):
object.__setattr__(self, '_target', target)
def __getattr__(self, name):
print('get', name)
return getattr(self._target, name)
def __setattr__(self, name, value):
print('set', name)
setattr(self._target, name, value)
```
Важно использовать `object.__setattr__`, чтобы не попасть в рекурсию при установке `_target`.