RodegastВот практическая такая штука была на самом начале проектирования. И я от нее отказался по следующей причине: объект класса Server обязан создаваться с _id и form_data. Но для CRUD методов, которые будут вызываться от инстанса, не всегда будут иметь место как form_data так и _id.class Crud_Singleton: orm = .... class BaseData: def __init__(self): self._orm = Crud_Singleton() class Server(BaseData): def __init__(self, _id, form_data): super().__init__() self._id = _id self.form_data = form_data def create(self): self._orm.save(self.form_data) def get_by_id(self): self._orm.get(self._id) def delete(self): self._orm.delete(self._id)
В случае R будет только _id, в случае C - только form_data и так далее. Значит в инициализатор надо передавать в какой-то позиции None. Я понял такой подход как неверный. Именно это у меня и вызвало все вопросы. Мы имеем в виду телевизор, который умеет включаться и показывать изображение. Но производим то телевизор без экрана, то без кнопки включения.
Я подозревал, что я неправильно понимаю ООП, но копаясь в гугле, нашел статью ровно о том же. Там предлагалось делать в классе методы порождения объекта через разные наборы как раз. То есть что-то типа:
@classmethod create_instance_by_form_data(cls, form_data): return cls(form_data=form_data) create_instance_by_id(cls, id): return cls(id=id)
Обосновывалось тем, что так честнее для клиента и это не запутывает использование инициализатора.