Как мне создать объект с временными входными данными с классами данных Python?Python

Программы на Python
Anonymous
Как мне создать объект с временными входными данными с классами данных Python?

Сообщение Anonymous »

У меня вопрос о лучших практиках использования классов данных Python. Структура класса данных. Можно ли удалять временные атрибуты класса или мне лучше полностью отказаться от класса данных?
Я хочу использовать атрибут IOMap (предложения названий приветствуются) для представления потока через фабрику, где входные данные имеют отрицательную скорость, а выходные данные имеют положительную скорость. Однако я знаю, что мои пользователи, вероятно, будут думать с точки зрения входных и выходных данных, поэтому я хочу дать им возможность создавать класс таким образом.
Есть два способа сделать это. этот. Это традиционный подход:

Код: Выделить всё

class Factory(Building):
def __init__(self,
*,
id: str,
name: str,
power: int,
size: int,
inputs: Dict[Material, float] = None,
outputs: Dict[Material, float] = None,
IOMap: Dict[Material, float] = None,
):
super().__init__(id, name, power, size)

if IOMap is not None:
if inputs is not None or outputs is not None:
raise ValueError("IOMap cannot be used with inputs or outputs.")
self.IOMap = IOMap
else:
if inputs is None or outputs is None:
raise ValueError("inputs and outputs must be provided if IOMap is not.")
self.IOMap = outputs
for material, rate in inputs.items():
self.IOMap[material] = self.IOMap.get(material, 0) - rate
А это подход к классам данных:

Код: Выделить всё

@dataclass
class Factory(Building):
inputs: Optional[Dict[Material, float]] = None
outputs: Optional[Dict[Material, float]] = None
IOMap: Optional[Dict[Material, float]] = None

def __post_init__(self):
if IOMap is not None:
if inputs is not None or outputs is not None:
raise ValueError("IOMap cannot be used with inputs or outputs.")
self.IOMap = IOMap
else:
if inputs is None or outputs is None:
raise ValueError("inputs and outputs must be provided if IOMap is not.")
self.IOMap = outputs
for material, rate in inputs.items():
self.IOMap[material] = self.IOMap.get(material, 0) - rate
del self.inputs
del self.outputs
Мне это нравится гораздо больше, но удалять их таким образом кажется... неправильным.
Мне не нужны входные данные и выходные данные быть атрибутами класса. Поскольку IOMap будет использоваться исключительно для внутренних процессов, я не хочу, чтобы пользователи вообще думали, что они могут использовать входы и выходы.
Мне бы хотелось продолжайте использовать классы данных, поскольку Factory является родителем многих дочерних элементов, и было бы здорово не писать чудовищную функцию __init__ для каждого из них.
TLDR; Стоит ли удалять атрибуты класса, чтобы продолжать использовать классы данных, или лучше перейти к традиционному классу?


Подробнее здесь: https://stackoverflow.com/questions/785 ... ataclasses

Вернуться в «Python»