Когда создаётся новый класс в 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. Первый вызывается только при обращении к несуществующему атрибуту, а второй — при обращении к любому атрибуту. Это позволяет определить поведение класса при работе с атрибутами в зависимости от потребностей.
Перейти в телеграм, чтобы получить результаты теста





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