Должен ли я создавать каждый класс в своем собственном .py файле? - PullRequest
34 голосов
/ 20 января 2010

Я совсем новичок в Python в целом.

Я знаю, что могу создать несколько классов в одном файле .py, но мне интересно, должен ли я создавать каждый класс в отдельном файле .py

Например, в C # у меня был бы класс, который обрабатывает все взаимодействия с БД. Затем другой класс, у которого были бизнес-правила.

Так ли это в Python?

Ответы [ 6 ]

30 голосов
/ 20 января 2010

Нет. Типичный стиль Python - это размещение связанных классов в одном модуле. Может случиться так, что класс окажется в отдельном модуле (особенно если это большой класс), но он не должен быть самоцелью. И когда вы это сделаете, пожалуйста, не называйте модуль в честь класса - вы просто запутаете себя и других, о которых есть что.

8 голосов
/ 20 января 2010

Каждый файл .py представляет модуль, поэтому вы должны хранить логические группы функций, констант и классов вместе в одном файле.

Каждый класс в файле .py будет просто создавать эпический раздув в вашем модулестол, так как если вас интересует только один класс, вы все равно можете

from whatever import SomeClass
5 голосов
/ 12 января 2011

Я не соглашусь с остальными и скажу да.Для меня, я имел больший успех, помещая каждый класс в свой собственный файл (модуль).Но есть исключения, поэтому позвольте мне объяснить на примере.

Если у вас есть класс Foo, поместите его в файл с именем Foo.py со следующими разделами:

  1. Imports
    • . Здесь вы извлекаете зависимости.
    • Примеры: import math, from Bar import *
  2. Globals
    • ThisЗдесь вы определяете внешний интерфейс вашего модуля, который представляет собой все символы, которые видны за пределами этого модуля.
    • Пример: __all__ = ['Foo']
    • Здесь также можно определить глобальныйпеременные (плохо) и глобальные константы (хорошо).Эти глобалы не нужно экспортировать;они могут быть сделаны глобальными просто для упрощения кода.
    • Пример: PI = 3.14159 означает, что вы можете написать PI, тогда как если вы определили его внутри класса Foo, вам нужно будет написать Foo.PI.
  3. Функции
    • Здесь вы определяете все функции верхнего уровня, которые относятся к классу Foo, но не принадлежат пространству имен класса Foo.Это, вероятно, редко, поскольку классы допускают как @staticmethods, так и внутренние классы.
    • Пример: def print_foo(foo): print(foo)
  4. Классы
    • Пример: class Foo(object): pass

Иногда вам может понадобиться разместить более одного класса в одном модуле.Это следует делать всякий раз, когда два или более классов концептуально связаны с точкой, в которой вы почти всегда используете их вместе, а не независимо.Это исключение, а не норма.В этом случае добавьте все имена классов в __all__ global.

Наконец, для каждого модуля Foo.py должен быть соответствующий модуль модульного тестирования с именем testFoo.py.

3 голосов
/ 20 января 2010

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

2 голосов
/ 04 сентября 2015

Да, каждый класс в своем собственном файле.Импорт даже одного класса (или функции) в файл с несколькими классами заставляет python выполнить определение всех классов в файле.Попробуйте это:

manyClass.py

class foo():
   print 'a bunch of time consuming work'

class tryme():
   print 'try me'

Теперь введите это в оболочке интерпретатора ...

из manyClasses import tryme

связкатрудоемкая работа
попробуй меня

2 голосов
/ 20 января 2010

Наверное, нет.Файлы Python являются «модулями».Модули должны содержать только то, какой код можно использовать повторно.Если это включает в себя несколько классов, что является нормой, тогда это нормально.

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