Класс Python, который возвращает подкласс при инициализации ⇐ Python
-
Anonymous
Класс Python, который возвращает подкласс при инициализации
Я сделал что-то не фабричное, но близкое к этому, и оно мне нравится, но выглядит странно. Это правильный способ делать такие вещи? Мне нужен класс с двумя шаблонами использования:
m = Model.read('ActivityDriven/0/conf.toml') print(f'{type(m) = }') # и
m = Model("DeGroot",{'gamma' : 1}) print(f'{type(m) = }') # Первая часть — это стандартное поведение фабрики, а не вторая (насколько я понимаю)
Итак, вот мой код:
импортировать томл из abc импорт ABC, абстрактный метод Модель класса (ABC): _регистрация = {} def new(cls, model_type, params): if cls == Model: # Проверка, является ли экземпляр класса базовым если model_type в cls._registry: return super(Model, cls._registry[model_type]).new(cls._registry[model_type]) еще: поднять ValueError(f «Неизвестный тип модели: {model_type}») вернуть супер(Модель, cls).new(cls) def init(self, model_type, params): self.model_type = model_type self.params = параметры @classmethod Защитный регистр (cls, model_type): декоратор def (подкласс): cls._registry[model_type] = подкласс возвращать подкласс вернуть декоратор @classmethod def read(cls, имя файла): данные = toml.load(имя файла) model_type = data.get("симуляция", {}).get("модель") параметры = data.get(тип_модели, {}) если model_type отсутствует в cls._registry: поднять ValueError(f «Неизвестный тип модели: {model_type}») вернуть cls._registry[тип_модели](тип_модели, параметры) @abstractmethod защита get_tension (сам): поднять NotImplementedError( «Свойство натяжения должно быть реализовано в подклассах») защита repr(сам): return f"Model(model_type={self.model_type}, params={self.params})" @Model.register("ActivityDriven") класс ActivityDrivenModel (Модель): защита get_tension (сам): вернуть 0 @Model.register("ДеГрут") класс DeGrootModel(Модель): защита get_tension (сам): вернуть 0 Правильно ли это делать и хорошая ли это идея?
Я сделал что-то не фабричное, но близкое к этому, и оно мне нравится, но выглядит странно. Это правильный способ делать такие вещи? Мне нужен класс с двумя шаблонами использования:
m = Model.read('ActivityDriven/0/conf.toml') print(f'{type(m) = }') # и
m = Model("DeGroot",{'gamma' : 1}) print(f'{type(m) = }') # Первая часть — это стандартное поведение фабрики, а не вторая (насколько я понимаю)
Итак, вот мой код:
импортировать томл из abc импорт ABC, абстрактный метод Модель класса (ABC): _регистрация = {} def new(cls, model_type, params): if cls == Model: # Проверка, является ли экземпляр класса базовым если model_type в cls._registry: return super(Model, cls._registry[model_type]).new(cls._registry[model_type]) еще: поднять ValueError(f «Неизвестный тип модели: {model_type}») вернуть супер(Модель, cls).new(cls) def init(self, model_type, params): self.model_type = model_type self.params = параметры @classmethod Защитный регистр (cls, model_type): декоратор def (подкласс): cls._registry[model_type] = подкласс возвращать подкласс вернуть декоратор @classmethod def read(cls, имя файла): данные = toml.load(имя файла) model_type = data.get("симуляция", {}).get("модель") параметры = data.get(тип_модели, {}) если model_type отсутствует в cls._registry: поднять ValueError(f «Неизвестный тип модели: {model_type}») вернуть cls._registry[тип_модели](тип_модели, параметры) @abstractmethod защита get_tension (сам): поднять NotImplementedError( «Свойство натяжения должно быть реализовано в подклассах») защита repr(сам): return f"Model(model_type={self.model_type}, params={self.params})" @Model.register("ActivityDriven") класс ActivityDrivenModel (Модель): защита get_tension (сам): вернуть 0 @Model.register("ДеГрут") класс DeGrootModel(Модель): защита get_tension (сам): вернуть 0 Правильно ли это делать и хорошая ли это идея?