Чи вважається в python краще визначити модуль з функціями або модуль з класом, який містить функції? [зачинено]


13

У моєму коді будь-який із наведених вище варіантів буде однаково добре працювати, але мені цікаво дізнатися плюси та мінуси обох підходів.

Відповіді:


9

Це чесно залежить від ваших потреб. Більшу частину часу модуль функцій буде тим, що ви шукаєте.

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

  • Модуль функцій: загальне призначення, корисність та інші "глобальні" функції
  • Модуль класу функцій: згруповані класи подібних потреб, різні типи даних пов'язаного списку або функції обробки аудіо або різні типи дерев.

Модуль призначений для загальної ієрархічної групування подібних систем, у мене зазвичай є всі функції утиліти під одним модулем, всі дані під іншим, мій рівень даних та роз'єми під більш "батьківським" модулем типу. Оскільки модуль є лише ментальним угрупованням, то менше про те, які типи систем є в ньому (класи чи функції, якщо чесно, мабуть, це поєднання двох) та більше про логічні зв’язки між системами під модулем.


6
Я не розумію контрасту між класом Python та іншими мовами. Якою мовою ви мали б клас з функціями, які не мають логічної причини групування?
Гай Сіртон

7

Основне питання - чи потрібно мати різні екземпляри вашого модуля / класу. модуль python - це як синглтон - ви посилаєтесь завжди на один і той же об'єкт, тобто якщо вам потрібні екземпляри, вам потрібен клас.

Однак, якщо вам не потрібні екземпляри, у вас все ще може виникнути потреба встановити свій "об'єкт" на початковий стан. хоча це очевидно можливо за допомогою простого модуля, якщо ініціалізація є більш складною, ніж просто встановлення деяких значень, я б радив мати код ініціалізації в __init__методі класу для читабельності.


2
можливо, варто зазначити, що ви, мабуть, говорите про щось, що має стан, наприклад, модуль із глобальними змінними проти класу зі змінними-членами. якщо у вашому класі є тільки методи, але немає стану, є мало причин мати кілька примірників
thbusch

3
@thbusch, так, це мається на увазі в необхідних випадках .
kr1

Коли ви говорили про необхідність екземпляра, який змусив мене зрозуміти модуль проти класу. Начебто, якщо мені потрібно було зробити кілька автомобілів, то клас підходив би проти модуля калькулятора, де мені не потрібно робити купу калькуляторів, мені просто потрібно використовувати методи додавання і віднімання з цього модуля.
tazboy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.