@Bleno

Как разбить проект на модули?

Есть 3 файла:

api.py, users.py, posts.py

Все имена вымышленные, но отражают смысл всей этой задачи. Так вот. В файле api.py есть класс settings который обновляется по команде пользователя:

class settings:
    def update(self, sql): self.settings = sql.get_settings_from_db()
settings = settings()
settings.update(sql)


Понятно, файл api.py однажды импортирован в main.py и в нём инициализированы все необходимые переменные, в нашем случае settings.

Теперь, если добавить ещё пару классов, которые используют данные из класса settings, то получится что-то такое:
class settings:
    def update(self, sql): self.settings = sql.get_settings_from_db
class users:
    def say_id(self):
        print(settings.settings.id)
class posts:
    def do(self):
        print(settings.settings.posts)
        #code here

settings = settings()


А теперь, чтобы код стал красивым разобьём всю эту красоту по файлам:
api.py
from classes.users import users
from classes.posts import posts

class settings:
    def update(self, sql): self.settings = sql.get_settings_from_db
settings = settings()
users = users()
posts = posts()

users.say_id()

users.py
class users:
    def say_id(self):
        print(settings.settings.id)

posts.py
class posts:
    def do(self):
        print(settings.settings.posts)
        #code here


При запуске api.py начинаются проблемы (и самое интересное): класс users не видит инициализированную переменную settings в api.py, значит у нас есть тривиальные пути:
1. Передать settings с вызовом функции:
users.say_id(settings)
Весьма просто и, по-моему мнению, не лучший вариант
2. Из файла users.py сделать импорт родительского модуля: import __main__ и потом уже __main__.settings().update()
Но так как settings.update() занимает ресурсы: подключается к бд и тянет инфу, и если вызовов users.say_id несколько тысяч в секунду, то сами понимаете, 1000 раз в секунду обновлять настройки, которые могут не меняться месяцами (глупо).

Если резюмировать
Нужно как-то объединить всю эту красоту под одним пространством имён, при этом, чтобы классы были разбиты на файлы и в итоге импортировались в один. Надеюсь на вас.
  • Вопрос задан
  • 3002 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Karpion
Смените заголовок вопроса - он сейчас вообще не о том.
Ответ написан
Комментировать
moonz
@moonz
web developer | seo | design
Для начала нужно инициализировать экземпляры в классе настроек.

class Settings(object):
    def __init__(self):
        self.posts = Posts()


Я бы вообще рекомендовал использовать наследования, но видимо для вас это ещё слишком сложно.

p.s | В вашем случае проблема может быть вызвана ошибкой идентации, так-как у вас переменные определены в глобальном скоупе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы