Что произойдет в Python при попытке доступа к несуществующему атрибуту объекта?

Ответ

По умолчанию, при попытке доступа к атрибуту, которого нет у объекта, Python возбуждает исключение AttributeError.

Это основной механизм, сигнализирующий о том, что вы пытаетесь использовать свойство или метод, не определенный в классе объекта или не присвоенный экземпляру динамически.

Стандартное поведение:

class User:
    def __init__(self, name):
        self.name = name

user = User("Alice")

print(user.name)  # Вывод: Alice

try:
    print(user.age) # Атрибута 'age' не существует
except AttributeError as e:
    print(e)      # Вывод: 'User' object has no attribute 'age'

Продвинутые способы обработки:

  1. Переопределение __getattr__: Можно определить магический метод __getattr__(self, name), который будет вызываться только тогда, когда стандартный механизм поиска атрибута не увенчался успехом. Это позволяет реализовать динамическую обработку запросов к атрибутам.

    class DynamicAttributes:
        def __getattr__(self, name):
            return f"Атрибут '{name}' был запрошен динамически."
    
    d = DynamicAttributes()
    print(d.anything) # Вывод: Атрибут 'anything' был запрошен динамически.
  2. Проверка с помощью hasattr(): Для безопасной проверки наличия атрибута перед его использованием применяется встроенная функция hasattr().

    if hasattr(user, 'age'):
        print(user.age)
    else:
        print("Атрибут 'age' отсутствует.")