Расскажите, пожалуйста, как работает данный код

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
Здравствуйте! Подскажите, пожалуйста, как устроено данное меню? Какие конструкции использованы? В частности особенно непонятно, как строится соответствие пунктов меню и вызываемых методов. Как устроен класс Calc понятно. Непонятно, как связаны между собой классы Menu и Params и как устроен каждый из них внутри.

Заранее благодарю за понятный и развёрнутый ответ в виде текста или, может быть, комментариев к коду. Код прикрепила.
Python:
class Menu():
    """ Класс меню """

    def __init__(self, params):
        self.params = params
        self.commands = {
            "0": ("ВЫХОД", lambda: exit())
        }
        self.commands.update(self.params.commands)
        self.errors = {
            "0": ("", lambda: print("Неправильный пункт меню"))
        }

    def PrintMenu(self):
        while (True):
            print()
            print("_______________________М Е Н Ю_______________________")
            for k, v in self.commands.items():
                print(f"{k} - {v[0]}")
            print()
            enter = input("Введите номер пункта меню: ")
            print()
            self.commands.get(enter, self.errors["0"])[1]()
            print()


class Calc():
    """Класс калькулятор"""

    def add(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Сумма чисел равна:", a + b)

    def sub(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Разность чисел равна:", a - b)

    def mul(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Произведение чисел равно:", a * b)


class Params():
    """Класс с данными для меню"""
    def __init__(self):
        self.c = Calc()

        self.commands = {
            "1": (
                "узнать сумму введенных чисел ",
                lambda: self.c.add()
            ),
            "2": (
                "узнать разность введенных чисел ",
                lambda: self.c.sub()
            ),
            "3": (
                "узнать произведение введенных чисел ",
                lambda: self.c.mul()
            )
        }

p = Params()  # экземпляр класса с данными для меню
menu = Menu(p)  # экземпляр класса меню
menu.PrintMenu()  # вывод меню в консоль
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Подскажите, пожалуйста, как устроено данное меню?
Класс Menu при создании принимает в качестве аргумента класс Params, который содержит данные для создания меню (текст пунктов и ссылки на вызываемые методы при выборе этих пунктов). Эти данные добавляются в словарь self.commands, который потом используется для формирования меню. Словарь self.error служит для хранения ошибок (в данном случае одной ошибки - неверно выбранного пункта меню).
Метод PrintMenu выводит меню в консоль. Меню формируется путем перебора пунктов словаря self.commands и вывода строк из него в виде "ключ - нулевой элемент значения словаря по данному ключу (описание пункта меню)".
При выборе пользователем пункта меню в словаре self.commands ищется соответствующий ключ и если он там есть - то выполняется функция из первого элемента значения словаря по этому ключу (метод привязанный к данному пункту меню), если такого ключа нет в словаре - выполняется функция, которая выводит сообщение об ошибке.
Класс Params содержит данные для создания меню. В данном случае в нем содержится экземпляр класса Calc и словарь self.commands в котором ключи - это номера пунктов для меню, а значения это кортежи, содержащие описание пункта меню и ссылку на метод, привязанный к данному пункту меню.
 
  • Мне нравится
Реакции: Ника

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
Класс Menu при создании принимает в качестве аргумента класс Params, который содержит данные для создания меню (текст пунктов и ссылки на вызываемые методы при выборе этих пунктов). Эти данные добавляются в словарь self.commands, который потом используется для формирования меню. Словарь self.error служит для хранения ошибок (в данном случае одной ошибки - неверно выбранного пункта меню).
Метод PrintMenu выводит меню в консоль. Меню формируется путем перебора пунктов словаря self.commands и вывода строк из него в виде "ключ - нулевой элемент значения словаря по данному ключу (описание пункта меню)".
При выборе пользователем пункта меню в словаре self.commands ищется соответствующий ключ и если он там есть - то выполняется функция из первого элемента значения словаря по этому ключу (метод привязанный к данному пункту меню), если такого ключа нет в словаре - выполняется функция, которая выводит сообщение об ошибке.
Класс Params содержит данные для создания меню. В данном случае в нем содержится экземпляр класса Calc и словарь self.commands в котором ключи - это номера пунктов для меню, а значения это кортежи, содержащие описание пункта меню и ссылку на метод, привязанный к данному пункту меню.
Благодарю за подробное объяснение!
 

Форум IT Специалистов