В чем разница между __getattribute__ и __getattr__ в Python
Python
Middle
Aston
В чем разница между __getattribute__ и __getattr__ в Python
Ответы
Оба метода используются для доступа к атрибутам, но работают в разных случаях:
`__getattribute__` вызывается **всегда** при попытке доступа к любому атрибуту объекта, даже если атрибут существует. Это низкоуровневый метод, который реализует сам механизм поиска атрибутов.
`__getattr__` вызывается **только если** атрибут не найден стандартными способами (через `__dict__`, дескрипторы и т.д.). Используется для обработки "несуществующих" атрибутов.
Пример:
```
class Test:
def __init__(self):
self.x = 10
def __getattribute__(self, name):
print(f"Getting {name}")
return super().__getattribute__(name)
def __getattr__(self, name):
print(f"Attribute {name} not found")
return 0
t = Test()
print(t.x) # Вызовет __getattribute__
print(t.y) # Сначала __getattribute__, потом __getattr__
```
Важно: в `__getattribute__` нужно быть осторожным с рекурсией - обращение к атрибутам внутри него должно идти через `super()` или напрямую к `__dict__`.