Как правильно составить импорты?

Я пытался попробовать написать консольное меню, но я не понимаю как правильно использовать импорты в файлах Вот что у меня есть:

- root
  - testlib
    - __init__.py
    - base.py
  - app.py
  - start.py

start.py

import testlib
import app

if __name__ == "__main__":
    app = app.ConsoleApp(testlib.Menu)
    app.mainloop()

app.py

class ConsoleApp:
    TEXT_INPUT = "Выберете вариант: "
    
    def __init__(self, __function):
        self.__screen = __function()
  
    def mainloop(self):
        while True:
            self.__option = input(self.TEXT_INPUT)
            self.__screen = self.__screen.select(self.__option)

testlib

# __init__.py
from .base import *


# base.py
class PrintMain:
    def __init__(self):
        self.name = self.__class__
        self.print()


class Menu(PrintMain):
    def print(self):
        
        print(f'''
            При запуске - выбор
            [q] Exit
            [1] Menu2
        ''')
        
    def select(self, __option):
        if __option == "q":
            raise TypeError("Выход из программы")
        if __option == "1":
            return Menu2()
        else:
            return self.name()
            

class Menu2(PrintMain):
    def print(self):
        
        print(f'''
            При запуске - выбор
            [q] Exit
            [1] Menu3
        ''')
        
    def select(self, __option):
        if __option == "q":
            raise TypeError("Выход из программы")
        if __option == "1":
            return Menu3()
        else:
            return self.name()
            
            
class Menu3(PrintMain):
    def print(self):
        
        print(f'''
            При запуске - выбор
            [q] Exit
            [1] Menu
        ''')
        
    def select(self, __option):
        if __option == "q":
            raise TypeError("Выход из программы")
        if __option == "1":
            return Menu()
        else:
            return self.name()

Так всё работает. Но я хочу сделать так:

- root
  - testlib
    - __init__.py
    - base.py
    - menu.py
    - menu2.py
    - menu3.py
  - app.py
  - start.py

Чтобы файл (menu.py, menu2.py, menu3.py) имели один класс с таким же названием

# __init__.py
from .base import *

# base.py
class PrintMain:
    def __init__(self):
        self.name = self.__class__
        self.print()


# menu.py
class Menu(PrintMain):
    def print(self):
        
        print(f'''
            При запуске - выбор
            [q] Exit
            [1] Menu2
        ''')
        
    def select(self, __option):
        if __option == "q":
            raise TypeError("Выход из программы")
        if __option == "1":
            return Menu2()
        else:
            return self.name()


# menu2.py
class Menu2(PrintMain):
    def print(self):
        
        print(f'''
            При запуске - выбор
            [q] Exit
            [1] Menu3
        ''')
        
    def select(self, __option):
        if __option == "q":
            raise TypeError("Выход из программы")
        if __option == "1":
            return Menu3()
        else:
            return self.name()
            

# menu3.py
class Menu3(PrintMain):
    def print(self):
        
        print(f'''
            При запуске - выбор
            [q] Exit
            [1] Menu
        ''')
        
    def select(self, __option):
        if __option == "q":
            raise TypeError("Выход из программы")
        if __option == "1":
            return Menu()
        else:
            return self.name()
            

Проблема в том, что я не понимаю, как написать импорты, чтобы не возникала ошибка типа - "PrintMain not found" у файлов menu.py, menu2.py, menu3.py. Чтобы можно было обратиться в start.py как:

testlib.Menu
testlib.Menu2
testlib.Menu3

Помогите пожалуйста, я уже несколько дней не могу решить.


Ответы (1 шт):

Автор решения: Сергей Кох

В каждый menu файл добавьте импорт from base import PrintMain .

→ Ссылка