Sobes.tech
Назад к вопросам
Junior — Middle
52

Каким образом методы __getattr__ и __getattribute__ влияют на доступ к атрибутам объектов в Python?

Ответ от нейросети

sobes.tech AI

В Python методы __getattr__ и __getattribute__ используются для перехвата доступа к атрибутам объектов, но работают они по-разному.

  • __getattribute__(self, name) вызывается всегда при попытке получить любой атрибут объекта. Это самый общий перехватчик доступа. Если в этом методе не вызвать базовый метод (например, super().__getattribute__(name)), можно легко создать бесконечную рекурсию.

  • __getattr__(self, name) вызывается только если атрибут с именем name не найден обычным способом (то есть он отсутствует в __dict__ и в классах).

Пример:

class A:
    def __getattribute__(self, name):
        print(f"__getattribute__ called for {name}")
        return super().__getattribute__(name)

    def __getattr__(self, name):
        print(f"__getattr__ called for {name}")
        return f"Значение по умолчанию для {name}"

obj = A()
obj.existing = 42
print(obj.existing)  # __getattribute__ вызывается, возвращает 42
print(obj.missing)   # __getattribute__ вызывается, не находит, затем __getattr__ вызывается

Таким образом, __getattribute__ позволяет контролировать весь доступ к атрибутам, а __getattr__ — только обработать случаи отсутствующих атрибутов.