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

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

Компании, где спрашивали
AstonAston

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

sobes.tech AI

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

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

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

Пример:

class Example:
    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"Default value for {name}"

obj = Example()
obj.existing = 42
print(obj.existing)  # Вызовет __getattribute__, вернёт 42
print(obj.missing)   # Вызовет __getattribute__, затем __getattr__, вернёт строку

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