Back to questions
Aston
Junior — Middle
74
Чем отличаются методы __getattribute__ и __getattr__ в Python и как они работают при доступе к атрибутам объекта?
Companies where asked
Answer from AI
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__ — запасной, для отсутствующих атрибутов.