Как правильно организовать определение класса Python относительно вспомогательных файлов для этого класса? - PullRequest
6 голосов
/ 04 августа 2011

Возможно, об этом уже спрашивали, но я не смог найти ответ на свой конкретный вопрос (довольно общий ...)

Вот пример моего вопроса.Скажем, мой пакет называется «школа», и у меня есть класс «книга», в котором рядом с ним будут находиться файлы .py, содержащие основную часть его методов.Я не уверен, как все это организовать, чтобы операторы импорта не выглядели странно.

Как организовать файлы?

/school/
        pencil/
        book/
             __init__.py
             read.py
             burn.py
             book.py

Я хочу иметь возможность делать что-то вродеэто, так как это имеет больше смысла:

from school import Book
b = Book(name="The Bible")
b.read()

Но из приведенной выше файловой структуры мне придется сделать:

from school.book import Book
b = Book(....etc

ИЛИ

from school import book
b = book.Book(...etc

Это неуклюжие / повторяющиеся ... что мне здесь не хватает?

1 Ответ

7 голосов
/ 04 августа 2011

Думаю, вы путаете пакеты с классами.Лично я поместил бы каждое определение класса и все функции, которые были непосредственно связаны с этим классом, в один файл .py.Например, чтение - это не объект, поэтому я бы поставил его как функцию в классе Book, а не в своем собственном файле .py.Итак, структура будет выглядеть примерно так:

/school/
    pencil.py
    book.py

Внутри book.py у вас будет что-то вроде этого

class Book():
    def __init__(self,name,author,isbn,your_variable_here):
        #Your init method

    def read(self,kid):
        return "{0} is reading {1}.".format(kid,self.name)

    def burn(self,library,lighter):
        library.remove(self)
        lighter.light(self)
        return "Preparing to burn people."

Тогда ваш импорт будет выглядеть следующим образом.

from school import book
    b = book.Book("The Art of War","Sun Tzu",'999342052X','Books rock!')
    b.read(ike) #This assumes ike is an object, probably of the class Student, defined and imported from elsewhere
    b.burn(library,lighter) #Once more, I'm assuming these are objects for which you've imported the definition and defined them earlier.

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

...