Я хочу использовать атрибут 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