- Они вырезают тонну шаблонного кода (больше не нужно писать self.foo = foo для каждого параметра __init__ и больше не нужно прописывать атрибут за атрибутом в методах расширенного сравнения)
- Они исключают поддержку кода при добавлении нового атрибута в класс (автоматическое __eq__, __repr__ и т. д. автоматически включают новое поле)
- Они упрощают проверку классов или их экземпляров (, dataclasses.asdict и т. д.)
Код: Выделить всё
dataclasses.fields - Функциональность легко выбрать; если вам нужно что-то более конкретное, чем стандартный __eq__, просто напишите это самостоятельно, и декоратор @dataclasses.dataclass легко включит его.
Даже если класс не является "классом данных" (возможно, у него есть только один или два параметра __init__, например), настройка его как класса данных все еще означает, что мне не нужно вводить __init__ самому, шаблонный __init__ полностью исчезает вместо того, чтобы загромождать код, и я получите все остальные преимущества класса данных бесплатно. Итак... почему бы и нет?
Каковы тревожные сигналы, указывающие на то, что использование класса данных не является хорошей идеей? Существуют ли какие-либо распространенные варианты использования, на которые легко указать и сказать: «Если классу нужно будет выполнять XYZ, класс данных просто сделает это более сложным, а не менее»?
Единственное, о чем я смог подумать, это то, что все может стать запутанным, когда в игру вступает наследование (особенно множественное наследование), но документация по классу данных наследование четкое и понятное, а параметр kw_only в dataclasses.field решает проблемы с унаследованными полями класса данных со значениями по умолчанию.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -particula
Мобильная версия