Встроенные функции Python. Работа с атрибутами объектов
Рассмотрим на примерах, как взаимодействовать с атрибутами объектов с помощью встроенных функций hasattr(), getattr(), setattr(), delattr().
Для начала определим, что такое атрибут. Простыми словами, это что-то вроде переменной, которая связана с объектом и хранит в себе какие-то данные.
Создадим экземпляр класса Cat
и разберем работу с атрибутами при помощи встроенных функций.
class Cat: def __init__(self, name: str, age: int) -> None: self.name = name self.age = age cat_bob = Cat(name="Bob", age=2)
hasattr(). Проверяем наличие атрибута
print(hasattr(cat_bob, "name")) > True print(hasattr(cat_bob, "breed")) > False
try: cat_bob.name except AttributeError: print(False) else: print(True) > True try: cat_bob.breed except AttributeError: print(False) else: print(True) > False
Мы пробуем получить атрибут экземпляра класса (блок try) и если он есть - печатаем True
(блок else). При попытке получить доступ к несуществующему атрибуту вызывается исключение AttributeError
, мы обрабатываем это исключение и просто принтим False
.
На самом деле, внутри hasattr() происходит нечто подобное. Внутри происходит вызов getattr()
и проверяется, вызывает ли он AttributeError
.
getattr(). Получаем значение атрибута
getattr(object, name, default)
object
: объект, у которого получаем значение атрибутаname
: имя атрибута, типstr
default
[опционально]
- Значение именованного атрибута объекта. Если атрибут по имени не найден, возвращается
default
(если указан), в противном случае вызывается исключениеAttributeError
.
print(getattr(cat_bob, "name")) > Bob print(getattr(cat_bob, "breed")) > AttributeError: 'Cat' object has no attribute 'breed' print(getattr(cat_bob, "breed", "Russian blue")) > Russian blue
print(cat_bob.name) > Bob print(cat_bob.breed) > AttributeError: 'Cat' object has no attribute 'breed'
setattr(). Присваиваем значение атрибуту
object
: объект, атрибуту которого присваивается значениеname
: имя атрибута, типstr
value
: Присваиваемое значение, тип:Any
Аргумент name
может содержать имя как уже существующего атрибута, так и нового, который мы хотим создать.
# Добавляем новый атрибут объекту и присваиваем ему значение setattr(cat_bob, "breed", "Russian blue") print(cat_bob.breed) > Russian blue # Присваиваем новое значение существующему атрибуту print(cat_bob.name) > Bob setattr(cat_bob, "name", "Rob") print(cat_bob.name) > Rob
# Добавляем новый атрибут объекту и присваиваем ему значение cat_bob.breed = "Russian blue" print(cat_bob.breed) > Russian blue # Присваиваем новое значение существующему атрибуту print(cat_bob.name) > Bob cat_bob.name = "Rob" print(cat_bob.name) > Rob
delattr(). Удаляем именованный атрибут
Аргумент name
должен быть именем существующего атрибута объекта.
Попробуем удалить атрибут объекта и проверим результат с помощью уже знакомой функции hasattr()
.
print(hasattr(cat_bob, "name")) > True delattr(cat_bob, "name") print(hasattr(cat_bob, "name")) > False
print(hasattr(cat_bob, "name")) > True del cat_bob.name print(hasattr(cat_bob, "name")) > False
Работа с подобными функциями часто бывает полезна, когда мы заранее не знаем, есть ли нужный нам атрибут у объекта. Таким образом, мы можем обработать потенциальные места возникновения ошибок.