В Python считается ли лучше определить модуль с функциями или модуль с классом, который содержит функции? [закрыто]

13

В моем коде любой из двух вышеупомянутых вариантов будет работать одинаково хорошо, но я заинтересован в выяснении плюсов и минусов обоих подходов.

TK100
источник

Ответы:

9

Это честно зависит от ваших потребностей. В большинстве случаев модуль функций будет тем, что вы ищете.

Классы Python (imho) не следует рассматривать как классы в C # или C ++ или Java, должна быть логическая причина для группировки набора функций в более крупного родителя, структуры данных были бы хорошим примером этого, вы хотите конгруэнтный набор функций, которые применяются непосредственно к классу вместо свободно собранного набора функций общего назначения.

  • Модуль функций: универсальные, вспомогательные и другие «глобальные» функции
  • Модуль класса функций: сгруппированные классы с похожими потребностями, различные типы данных связанного списка или функции обработки аудио или различные типы деревьев.

Модуль предназначен для общей иерархической группировки похожих систем, у меня обычно все функции утилит в одном модуле, все данные в другом, мой уровень данных и коннекторы в модуле более «родительского» типа. Поскольку модуль - это просто ментальная группировка, речь идет не столько о типах систем, которые в нем присутствуют (классы или функции, честно говоря, вероятно, их комбинация), а о логических связях между системами в модуле.

Джефф Лангемайер
источник
6
Я не понимаю контраст между классом Python и другими языками. На каком языке у вас будет класс с функциями, которые не имеют логической причины для группировки?
Гай Сиртон
7

Основной вопрос в том, нужны ли вам разные экземпляры вашего модуля / класса. модуль python подобен одиночному - вы всегда ссылаетесь на один и тот же объект, т. е. если вам нужны экземпляры, вам нужен класс.

Однако, если вам не нужны экземпляры, вам все равно может потребоваться установить ваш «объект» в исходное состояние. хотя это очевидно возможно с простым модулем, если инициализация более сложна, чем просто установка некоторых значений, я бы посоветовал иметь код инициализации в __init__методе класса для удобства чтения.

kr1
источник
2
возможно, стоит отметить, что вы, вероятно, говорите о чем-то, что имеет состояние, например, модуль с глобальными переменными против класса с переменными-членами. если в вашем классе есть только методы, но нет состояния, есть мало причин иметь несколько экземпляров
thbusch
3
@ thbusch, да, это подразумевается в случае необходимости .
kr1
Когда вы говорили о необходимости экземпляра, который помог мне понять модуль против класса. Например, если бы мне нужно было сделать несколько машин, тогда подойдет класс против модуля калькулятора, где мне не нужно делать кучу калькуляторов, мне просто нужно использовать методы сложения и вычитания из этого модуля.
tazboy