На этом шаге мы рассмотрим преимущества и недостатки создания собственного класса.
Классы позволяют определять "шаблоны" многократного использования для объектов данных, причем эти шаблоны гарантируют, что каждый объект предоставляет одинаковый набор полей.
Использование обычных классов Python в качестве типов данных запись вполне возможно, но это также влечет за собой ручную работу, связанную с получением удобных функциональных возможностей у других реализаций. Например, добавление новых полей в конструктор __init__ будет многословным и займет время.
Кроме того, принятое по умолчанию строковое представление объектов-экземпляров, создаваемых на основе собственных классов, не очень полезно. Чтобы это исправить, вам, вероятно, придется добавить свой собственный метод __repr__, который, как правило, довольно многословен и подлежит обновлению всякий раз, когда вы добавляете новое поле (см. 59 шаг).
Хранящиеся в классах поля могут изменяться, и новые поля могут добавляться свободно, нравится вам это или нет. С помощью декоратора @property можно обеспечить себе большее управление и создавать поля с доступом только для чтения, но это требует написания большего количества связующего кода.
См. документацию Python "property": https://docs.python.org/3/library/functions.html#property.
Написание собственного класса - отличная возможность, когда в объекты-записи требуется добавить бизнес-логику и поведение с использованием методов. Однако это означает, что такие объекты технически больше не являются простыми объектами данных.
>>> class Car: def __init__(self, color, mileage, automatic): self.color = color self.mileage = mileage self.automatic = automatic >>> car1 = Car('красный', 3812.4, True) >>> car2 = Car('синий', 40231.0, False ) # Получить пробег: >>> car2.mileage 40231.0 # Классы изменяемы: >>> car2.mileage = 12 >>> car2.windshield = 'треснутое' # Строковое представление не очень полезно # (приходится добавлять написанный вручную метод __repr__): >>> car1 <__main__.Car object at 0x000001FDF84D11F0>
На следующем шаге мы рассмотрим класс collections.namedtuple.