Шаг 110.
Python: тонкости программирования. ... . Записи, структуры и объекты переноса данных. Написание собственного класса - больше работы, больше контроля

    На этом шаге мы рассмотрим преимущества и недостатки создания собственного класса.

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

    Использование обычных классов 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.




Предыдущий шаг Содержание Следующий шаг