Найти тему
С любовью о Python

Встроенные функции 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(). Проверяем наличие атрибута

hasattr(object, name)

Аргументы:

  • object: объект, у которого проверяем наличие атрибута
  • name: имя атрибута, тип str

Возвращаемое значение:

  • bool. True - если строка является именем одного из атрибутов объекта; иначе - False.

Пример

print(hasattr(cat_bob, "name"))
> True

print(hasattr(cat_bob, "breed"))
> False

Эквивалент hasattr()

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)

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

Эквивалент getattr()

print(cat_bob.name)
> Bob

print(cat_bob.breed)
> AttributeError: 'Cat' object has no attribute 'breed'

setattr(). Присваиваем значение атрибуту

*Если объект это позволяет

setattr(object, name, value)

Аргументы:

  • object: объект, атрибуту которого присваивается значение
  • name: имя атрибута, тип str
  • value: Присваиваемое значение, тип: Any

Возвращаемое значение:

  • None

Аргумент 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

Эквивалент setattr()

# Добавляем новый атрибут объекту и присваиваем ему значение
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(). Удаляем именованный атрибут

*Если объект это позволяет

delattr(object, name)

Аргументы:

  • object: объект, у которого удаляется атрибут
  • name: имя атрибута, тип str

Возвращаемое значение:

  • None

Аргумент name должен быть именем существующего атрибута объекта.

Попробуем удалить атрибут объекта и проверим результат с помощью уже знакомой функции hasattr().

Пример

print(hasattr(cat_bob, "name"))
> True
delattr(cat_bob, "name")
print(hasattr(cat_bob, "name"))
> False

Эквивалент delattr()

print(hasattr(cat_bob, "name"))
> True
del cat_bob.name
print(hasattr(cat_bob, "name"))
> False

Работа с подобными функциями часто бывает полезна, когда мы заранее не знаем, есть ли нужный нам атрибут у объекта. Таким образом, мы можем обработать потенциальные места возникновения ошибок.

***

Присоединяйтесь ко мне в Telegram: https://t.me/python3_with_love. Там есть все, и читать код намного удобнее.

Наука
7 млн интересуются