Урок про разницу между атрибутами класса и атрибутами объекта, способы доступа к ним, а также про методы, которые работают с классом (@classmethod) и не зависят от экземпляра (@staticmethod). В конце — строковые представления объектов через __str__ и __repr__.
Атрибут класса общий для всех объектов; атрибут объекта принадлежит конкретному экземпляру.
Присваивание через объект создаёт новый атрибут объекта, а не меняет атрибут класса.
@classmethod получает cls, @staticmethod не получает ни self, ни cls.
__str__ — для пользователя, __repr__ — для разработчика и отладки.
Что запомнить:object.attr сначала ищет атрибут в объекте, а если не находит — в классе.
Частая ошибка: изменить поле класса через объект и удивиться, что другие объекты не увидели изменения.
О чём этот урок
Мы уже умеем создавать классы и инициализировать поля объектов в __init__. Теперь разберёмся, как хранить данные, общие для всего класса, — атрибуты класса. Учимся читать и изменять их, отличать от атрибутов объекта, использовать служебный атрибут __dict__, а также применять @classmethod и @staticmethod. В финале — магические методы __str__ и __repr__, которые делают вывод объектов понятным.
Что изучим
Атрибуты класса и объекта: где создавать и как искать.
Чтение, изменение и затенение атрибутов класса.
Атрибут __dict__ и порядок разрешения имён.
Значения по умолчанию для полей объекта.
Классовые методы @classmethod и альтернативные конструкторы.
Статические методы @staticmethod для вспомогательной логики.
Строковые представления: __str__ и __repr__.
Современные практики: аннотации типов, ClassVar, @dataclass.