Получаю ошибку: TypeError: Cannot create a consistent method resolution order (MRO) for bases Nutrition, Product, Breakfast, Lunch, Dinner, Snack

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
python 3.8
Здравствуйте! В моей программе есть несколько классов Nutrition, Product, Breakfast, Lunch, Dinner, Snack, в каждом из которых есть свои методы, и класс Menu, который необходим для работы пользователя с программой. Я наследую все имеющиеся классы в класс Menu, чтобы можно было вызывать в нём необходимые методы все остальных классов, но получаю ошибку:
Cannot create a consistent method resolution
order (MRO) for bases Nutrition, Product, Breakfast, Lunch, Dinner, Snack. Помогите, пожалуйста, решить проблему. Меню обязательно должно быть реализовано в виде класса. Код одного из классов и меню прикрепила.

Благодарю за развёрнутый ответ.

Python:
class Snack(Nutrition):
    """ класс перекус """

    # проверка кол-ва ккал на оптимальность для перекуса
    def optimal_P(self, s):
        optimal = Snack.optimal_KK(Snack.rKKal(gender, Kf, weight, height, age))

        # оптимальное кол-во ккал в перекус
        optimal_KP = optimal[3]

        if (optimal_KP - 10 < s < optimal_KP + 10):
            print("оптимальное кол-во калорий для перекуса")
        elif (optimal_KP - 50 > s):
            print("кол-во калорий НЕ оптимально для перекуса: необходимо увеличить калорийность перекуса")
        elif (s > optimal_KP + 50):
            print("кол-во калорий НЕ оптимально для перекуса: необходимо уменьшить калорийность перекуса")

    def Pp_optimal(self):
        Snack.optimal_P(Snack.summ_kkal())

class Menu(Nutrition, Product, Breakfast, Lunch, Dinner, Snack):
    """ класс меню """

    def PrintMenu(self):
        print("_______________________М Е Н Ю_______________________")
        print(" 1 - узнать реокмендованное кол-во ЖБУ и ккал в день")
        print(" 2 - проверка калорийности завтрака на оптимальность ")
        print(" 3 - проверка калорийности обеда на оптимальность ")
        print(" 4 - проверка калорийности ужина на оптимальность ")
        print(" 5 - проверка калорийности перекуса на оптимальность ")
        print(" 6 - расчет ЖБУ и ккал на фактический вес продукта ")
        print(" 0 - ВЫХОД ")
        print()

        while (True):
            enter = int(input("введите номер пункта меню : "))
            if enter == 1:
                print()
                Menu = Menu()
                Menu.rek()
                print()
            elif enter == 2:
                print()
                Menu = Menu()
                Menu.Zz_optimal()
                print()
            elif enter == 3:
                print()
                Menu = Menu()
                Menu.Oo_optimal()
                print()
            elif enter == 4:
                print()
                Menu = Menu()
                Menu.Uu_optimal()
                print()
            elif enter == 5:
                print()
                Menu = Menu()
                Menu.Pp_optimal()
                print()
            elif enter == 6:
                print()
                Menu = Menu()
                Menu.converter()
                print()
            elif enter == 0:
                exit()
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 587
459
83
у вас класс Snack уже унаследован от класса Nutrition, и в классе меню вы наследуете оба эти класса, питон не знает где искать методы, в Snack или Nutrition...
вам не нужно наследовать базовые классы, в данном случае достаточно будет унаследовать Snack, методы Nutrition вы получите уже от Snack
Nutrition уже включен в Snack, его не нужно снова указывать и наследовать
если у вас все классы перенаследованы друг от друга, в меню надо включить последний класс, от него вы получите все методы предыдущих классов

надеюсь понятно
 
  • Мне нравится
Реакции: Ника

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
у вас класс Snack уже унаследован от класса Nutrition, и в классе меню вы наследуете оба эти класса, питон не знает где искать методы, в Snack или Nutrition...
вам не нужно наследовать базовые классы, в данном случае достаточно будет унаследовать Snack, методы Nutrition вы получите уже от Snack
Nutrition уже включен в Snack, его не нужно снова указывать и наследовать
если у вас все классы перенаследованы друг от друга, в меню надо включить последний класс, от него вы получите все методы предыдущих классов

надеюсь понятно
Спасибо. Вы дали более чем понятный ответ на мой вопрос.
 

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