Как эффективно сделать текстовое меню?

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

class Options:
    def displayOptions():
        #display user options
    def option1():
        #do option 1
    def option2():
        #do option 2 
    def option3():
        #do option 3 and so on

class Menu(Options):
    options = {1: option1(), 2: option2(), 3: option3()} #and so on 
    def promptUser():
        #prompts user to make a choice
    def printHeader():
        #prints header
    def handleInput():
        #checks if input is valid
    def begin():
        #initialize menu

Будет ли что-то подобное запутанным? Является ли класс Options бессмысленным? Я новичок в ООП, и мне было интересно, как это можно сделать наиболее эффективно.

Что-то подобное, безусловно, может сработать, иногда абстракция того не стоит. Я думаю, вы бы написали немного больше, прежде чем кто-то мог составить обоснованное мнение.

Grady Player 21.03.2022 03:25

Вы на правильном пути со словарем options. Однако проблема в том, что option1 и другие не существуют в этой области. Таким образом, этот код не будет работать. Позвольте мне немного подумать.

Daniel Walker 21.03.2022 03:31

Предлагаю взглянуть на встроенный пакет cmd.

ddejohn 21.03.2022 04:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это немного хакерски, но он выполняет свою работу.

class Options:
    def doOption(self, opt):
        option = f'option{opt}'
        func = type(self).__dict__.get(option)
        if hasattr(func, '__call__'):
            return func(self)

        raise ValueError(f'Unsupported option: {opt}')

class Menu(Options):
    def option1(self):
        print('Foo!')

    def option2(self):
        print('Bar!')

    def optionbang(self):
        print('Bang!')

menu = Menu()
menu.doOption(1) # Foo!
menu.doOption(2) # Bar!
menu.doOption('bang') # Bang!

Это просматривает свойства класса и пытается найти функцию (например, hasattr(func, '__call__')) с правильным именем. Приятно то, что логика даже не требует, чтобы opt было целым числом.

При этом, если это ваш единственный вариант использования, то я согласен с @GradyPlayer в комментариях, что абстракция, вероятно, того не стоит.

Ух ты! Это была интересная точка зрения. На данный момент есть ли цель создать класс опций? Должны ли вы оставить класс только для целей организации или лучше просто превратить doOption() в метод меню?

ypranite 21.03.2022 06:37

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

Daniel Walker 21.03.2022 12:43

Пожалуйста, извините за мои вопросы, но каковы примеры других вариантов использования?

ypranite 21.03.2022 17:30

Совершенно никаких проблем. Представьте, что в вашей программе есть несколько меню, каждое из которых имеет разные параметры. В этом случае вы захотите использовать базовый класс Options, как показано выше, а затем подкласс для каждого другого набора параметров. Однако, если у вас есть только один набор опций, просмотр их через if/elif, вероятно, лучший способ. Не нужно слишком усложнять вещи для простого варианта использования.

Daniel Walker 21.03.2022 17:45

Другие вопросы по теме