Рассмотрим на примерах, как взаимодействовать с атрибутами объектов с помощью встроенных функций 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. Там есть все, и читать код намного удобнее.