Несколько классов в модуле Python - PullRequest
37 голосов
/ 14 апреля 2010

Я очень плохо знаком с Python (я работаю в JAVA), и мне интересно, кто-нибудь может мне помочь с некоторыми стандартами Python. Это нормальная или "правильная" практика, чтобы поместить несколько классов в модуль? Я работал с Django и начал с учебников, и они помещают свои классы модели базы данных в один и тот же модуль. Это то, что обычно делается, или я должен придерживаться 1 класс на модуль? Есть ли причина, по которой я бы сделал один над другим?

Надеюсь, я ясен, а не универсален. Спасибо всем заранее!

Ответы [ 5 ]

31 голосов
/ 14 апреля 2010

Вот полезное практическое правило из того, что я видел в типичных проектах Java:

Самый нижний пакет в Java должен быть файлом в Python

Что это значит? Если ваш проект Java был организован:

toplevel/
   subproject/
        Foo.java
        Bar.java
   subproject2/
        Baz.java
        Qux.java

Тогда ваш проект на Python должен выглядеть так:

toplevel/
    subproject.py <-- put class Foo, Bar here
    subproject2.py <-- put class Baz, Qux here

Что следует отметить: организация:

  • Не используйте внутренние классы. Просто положи занятия в одном модуле
  • По соглашению, все, что начинается с _, является "личным"
  • Это нормально иметь "открытые переменные"
6 голосов
/ 12 февраля 2013

Думайте об этом так.

В Java то, что вы пишете, является классом, где в случае с Python вы пишете модуль вместо класса. Таким образом, модуль может содержать несколько классов. Всякий раз, когда вы хотите использовать определенный класс, сначала импортируйте соответствующий модуль, а затем вызовите класс для создания объектов.

Вот пример.

Classes.py (это модуль с именем 'Classes')


class MyClass(object):  


    def greet(self):
        print("Hello World")


class MyNextClass(object):

    def greetAgain(self):
        print("Hello again")

Теперь я могу импортировать этот модуль из любого места, куда захочу


import Classes

if __name__ == '__main__':

    a=Classes.MyClass()
    a.greet()

    b=Classes.MyNextClass()
    b.greetAgain()

6 голосов
/ 14 апреля 2010

Если сомневаетесь, просто посмотрите на стандартные библиотеки Python:)

Например, стандартный модуль календаря содержит 31 класс. Так что да, все в порядке.

5 голосов
/ 14 апреля 2010

Это абсолютно правильно. Модуль группирует связанные функции. Если эта функциональность реализована в нескольких классах (например, Tree, Node, Leaf), то целесообразно разместить их вместе.

Модуль более тесно связан с пакетом Java, чем класс Java. Вы также можете реализовать модуль в виде папки, названной для модуля, с файлом __init__.py внутри (поэтому Python может идентифицировать модуль как таковой; __init__.py может также дополнительно включать код инициализации и списки классов, функций и субпакеты на экспорт.)

4 голосов
/ 14 апреля 2010

Это, безусловно, нормальная вещь в Python. Когда и почему вы выбираете одно над другим, отчасти зависит от вкуса, а отчасти от соглашения.

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

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