Понимание разницы между getattr

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

  1. __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__, который возвращает пользовательское сообщение об ошибке.

  2. __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, объектно-ориентированное программирование