В Python и __getattr__, и __getattribute__являются специальными методами, которые используются для обработки доступа к атрибутам в классах. Однако между ними есть некоторые важные различия.
-
__getattr__:
Метод__getattr__вызывается, когда атрибут не найден в ходе обычного процесса поиска атрибута. Он принимает имя атрибута в качестве параметра и возвращает значение или выдаетAttributeError, если атрибут не найден. Вот пример:class MyClass: def __getattr__(self, name): return f'Attribute {name} does not exist.' obj = MyClass() print(obj.some_attribute)Выход:
Attribute some_attribute does not exist.В этом примере, когда доступ к
obj.some_attributeне найден в объекте, вызывается метод__getattr__, который возвращает пользовательское сообщение об ошибке. -
__getattribute__:
Метод__getattribute__вызывается для каждого доступа к атрибуту, независимо от того, существует атрибут или нет. Он вызывается перед проверкой существования атрибута и позволяет настроить поведение доступа к атрибуту. Вот пример:class MyClass: def __getattribute__(self, name): print(f'Accessing attribute: {name}') return super().__getattribute__(name) obj = MyClass() obj.some_attributeВыход:
Accessing attribute: some_attributeВ этом примере при доступе к
obj.some_attributeсначала вызывается метод__getattribute__, позволяющий выполнять пользовательские действия, такие как регистрация или изменение доступа к атрибуту. поведение.
Важно отметить, что __getattribute__обычно используется реже, чем __getattr__, поскольку он вызывается при каждом доступе к атрибуту, что может привести к бесконечной рекурсии, если его не реализовать тщательно. Поэтому рекомендуется использовать __getattr__в большинстве случаев, когда вы хотите настроить доступ к атрибутам.
и getattribute в Python
, getattribute, объектно-ориентированное программирование