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