Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
02 Сен 2024
2 мин
1753

Разница между __getattr__ и __getattribute__ в Python

Когда создаётся новый класс в Python, возникает потребность в определении поведения при обращении к атрибутам этого класса. Для этого в Python предусмотрены

Когда создаётся новый класс в Python, возникает потребность в определении поведения при обращении к атрибутам этого класса. Для этого в Python предусмотрены специальные методы: getattr и getattribute. Важно понимать разницу между ними и знать, когда и какой из них следует использовать.

Пример обращения к атрибуту класса

class MyClass:
    def __init__(self):
        self.my_attr = 10

obj = MyClass()
print(obj.my_attr)  # Выведет: 10

В данном коде создаётся экземпляр класса MyClass, у которого есть атрибут my_attr. При обращении к этому атрибуту, Python просто возвращает его значение.

Метод getattr

Если попытаться обратиться к атрибуту, которого нет в классе, Python вызовет специальный метод getattr. Это позволяет определить поведение класса при обращении к несуществующему атрибуту.

class MyClass:
    def __init__(self):
        self.my_attr = 10

    def __getattr__(self, name):
        return f"Атрибут {name} не существует"

obj = MyClass()
print(obj.my_attr)  # Выведет: 10
print(obj.non_existent_attr)  # Выведет: Атрибут non_existent_attr не существует

Метод getattribute

Метод getattribute работает аналогично getattr, но с одним важным отличием: он вызывается при каждом обращении к любому атрибуту, а не только при обращении к несуществующему атрибуту.

class MyClass:
    def __init__(self):
        self.my_attr = 10

    def __getattribute__(self, name):
        return f"Пытаются получить атрибут {name}"

obj = MyClass()
print(obj.my_attr)  # Выведет: Пытаются получить атрибут my_attr
print(obj.non_existent_attr)  # Выведет: Пытаются получить атрибут non_existent_attr

Новые и старые стили классов

Новые стили классов в Python — это классы, которые являются прямыми или косвенными потомками object. В примерах выше использовались новые стили классов.

Старые стили классов — это классы, которые не наследуются от object. Они были доступны в Python 2, но в Python 3 все классы являются новыми стилями классов.

Заключение

Важно понимать разницу между методами getattr и getattribute. Первый вызывается только при обращении к несуществующему атрибуту, а второй — при обращении к любому атрибуту. Это позволяет определить поведение класса при работе с атрибутами в зависимости от потребностей.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий