Встроенные функции 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: имя атрибута, типstrdefault[опционально]
- Значение именованного атрибута объекта. Если атрибут по имени не найден, возвращается
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: имя атрибута, типstrvalue: Присваиваемое значение, тип: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
Работа с подобными функциями часто бывает полезна, когда мы заранее не знаем, есть ли нужный нам атрибут у объекта. Таким образом, мы можем обработать потенциальные места возникновения ошибок.