Python: выбор между модулями и классами

В моем приложении я должен поддерживать некоторые глобальные приложения и глобальные приложения, такие как подключенные пользователи, общее количество ответов, создание файла конфигурации приложения и т.д. Существует два варианта:

  • Создайте отдельный файл appstate.py с глобальными переменными с функциями над ними. Сначала это выглядит нормально, но кажется, что я что-то пропустил в ясности моего кода.

  • Создайте класс AppState с функциями класса в файле appstate.py, все остальные модули определены определенными заданиями. Это выглядит хорошо. Но теперь я должен написать длинную строку, например appstate.AppState.get_user_list(). Более того, методы не столько связаны друг с другом. Я могу создавать отдельные классы, но это было бы слишком много классов.

EDIT: если я использую классы, я буду использовать классные методы. Я не думаю, что необходимо создать экземпляр класса для объекта.

Ответы

Ответ 1

Второй подход кажется лучше. Я бы использовал первый только для файлов конфигурации или что-то в этом роде.

Во всяком случае, чтобы избежать проблемы, вы всегда можете:

from myapp.appstate import AppState

Таким образом, вам больше не нужно писать длинную строку.

Ответ 2

Звучит как классическая загадка:-) В Python нет ничего грязного или постыдного в выборе использования модуля, если это лучший подход. В конце концов, модули, функции и т.п. Являются, по сути, первоклассными гражданами на этом языке и предлагают интроспекцию и другие свойства, которые многие другие языки используют для получения объектов.

Как вы описали свои параметры, это похоже на то, что в этом случае вы не слишком сумасшедшие в отношении подхода на основе классов.

Я не знаю, использовали ли вы среду Django, но если не посмотрите их документацию о том, как они обрабатывают параметры. Они являются приложениями, они определены в модуле, и они доступны во всем мире. То, как они анализируют варианты и раскрывает их во всем мире, довольно элегантно, и вы можете найти такой подход, вдохновляющий на ваши нужды.

Ответ 3

Второй подход существенно отличается от первого подхода, если у вас есть состояние приложения, хранящегося в экземпляре AppState, и в этом случае ваша жалоба не применяется. Если вы просто храните вещи в классе и используете методы static/class, ваш класс не отличается от модуля, и вместо этого он будет pythonic, чтобы иметь его как модуль.

Ответ 4

Рассмотрим следующий пример:

configuration
|
+-> graphics
|   |
|   +-> 3D
|   |
|   +-> 2D
|
+-> sound

Реальный вопрос: в чем разница между классами и модулями в этой иерархии, поскольку они могут быть представлены обоими средствами?

Классы представляют типы. Если вы реализуете свое решение с помощью классов вместо модулей, вы можете проверить графический объект для его правильного типа, но написать общие графические функции.

С помощью классов вы можете создавать параметризованные значения. Это означает, что можно инициализировать по-разному класс звуков с помощью конструктора, но трудно инициализировать модуль с различными параметрами.

Дело в том, что вы действительно что-то отличное от точки зрения моделирования.

Ответ 5

Я бы пошел с маршрутом классов, так как он лучше упорядочил ваш код. Помните, что для удобства чтения вы можете это сделать:

from appstate import AppSate

Ответ 6

Я бы выбрал второй вариант: уже использовал первый, теперь мне приходится рефакторировать, так как мое приложение развилось и ему нужно поддерживать более модульные конструкции, поэтому мне теперь нужно обрабатывать несколько одновременных "конфигураций".

Второй подход - это ИМО, более гибкое и будущее доказательство. Чтобы избежать более длинных строк кода, вы можете использовать from appstate import AppState вместо import appstate.

Ответ 7

Почему бы не пойти с экземпляром этого класса? Таким образом, вы, возможно, даже сможете использовать 2 разных сеанса, в зависимости от того, какой экземпляр вы используете. Это может сделать его более гибким. Возможно, добавьте в модуль какой-то метод get_appstate(), чтобы он инициализировал класс один раз. Позже, если вы захотите несколько экземпляров, вы можете изменить этот метод, чтобы в конечном итоге принять параметр и использовать какой-либо словарь и т.д., Чтобы сохранить эти экземпляры.

Вы также можете использовать атрибуты свойств btw, чтобы сделать вещи более читабельными и иметь гибкость в хранении, как и где вы хотите сохранить.

Я согласен, что было бы более pythonic использовать модульный подход вместо classmethods.

Кстати, я не настолько большой поклонник наличия вещей, доступных во всем мире каким-то "волшебством". Я бы предпочел использовать явный вызов для получения этой информации. Затем я знаю, откуда берутся вещи и как отлаживать их, когда что-то не получается.