В настоящее время я делаю программу с текстовым меню, и мне было интересно, можно ли вообще избежать чрезмерного количества операторов 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 бессмысленным? Я новичок в ООП, и мне было интересно, как это можно сделать наиболее эффективно.
Вы на правильном пути со словарем options
. Однако проблема в том, что option1
и другие не существуют в этой области. Таким образом, этот код не будет работать. Позвольте мне немного подумать.
Это немного хакерски, но он выполняет свою работу.
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() в метод меню?
Если это ваш единственный вариант использования, вы можете просто объединить его в один класс.
Пожалуйста, извините за мои вопросы, но каковы примеры других вариантов использования?
Совершенно никаких проблем. Представьте, что в вашей программе есть несколько меню, каждое из которых имеет разные параметры. В этом случае вы захотите использовать базовый класс Options
, как показано выше, а затем подкласс для каждого другого набора параметров. Однако, если у вас есть только один набор опций, просмотр их через if
/elif
, вероятно, лучший способ. Не нужно слишком усложнять вещи для простого варианта использования.
Что-то подобное, безусловно, может сработать, иногда абстракция того не стоит. Я думаю, вы бы написали немного больше, прежде чем кто-то мог составить обоснованное мнение.