Создание другого класса на основе пользовательского ввода - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь написать расширяемый код Python для реализации нескольких различных алгоритмов оптимизации.Я не очень опытен в объектно-ориентированном программировании, поэтому мой вопрос может быть сформулирован некорректно, но я думаю, что я борюсь с настройкой наследования и / или полиморфизма в моем коде.

Я хочу иметь возможность выбирать между несколькими различными алгоритмами оптимизации, основанными на пользовательском вводе.Первым делом я хотел написать класс Optimizer, который будет содержать всю общую информацию, а затем иметь конкретные классы для каждого алгоритма, которые наследуют класс Optimizer.

class Optimizer:
    def __init__(self, user_input):
        pass

class Method1(Optimizer):
    def__init__(self, user_input):
        pass
    def run()
        pass

class Method2(Optimizer):
    def__init__(self, user_input):
        pass
    def run()
        pass

Я быстро понял, что вам нужно знать, какой метод вы собираетесь использовать, прежде чем инициализировать оптимизатор.Это не конец света, но кажется более понятным анализ пользовательского ввода при инициализации объекта оптимизатора.Я хотел бы иметь возможность инициализировать оптимизатор с помощью чего-то вроде:

optimizer = Optimizer(user_input)

с полученным оптимизатором, имеющим правильное поведение, основанное на поле 'method', встроенном в файл user_input.

Каков наилучший способ сделать это так, чтобы мне не нужно было переписывать кучу операторов switch, когда я добавляю новый метод?

Спасибо!

1 Ответ

0 голосов
/ 11 сентября 2018

У меня есть статья , посвященная именно этой теме.

Короче, вам лучше заранее объявить, как пользовательский ввод отображается в класс.Для этого вы можете использовать:

  • Явное отображение
  • Динамическое создание имени класса
  • Реестр и декоратор класса
  • Пользовательский метакласс
  • Хук подкласса init

Подробнее читайте в статье, которую я упомянул выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...