如何合理组织Python类定义及其辅助文件?

6 投票
1 回答
2837 浏览
提问于 2025-04-16 22:51

这个问题可能之前有人问过,但我找不到针对我具体问题的答案(其实问题挺普遍的……)

让我给你举个例子。假设我的包叫做'school',里面有一个叫'book'的类,旁边会有一些.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

我觉得你把包和类搞混了。个人来说,我会把每个类的定义和所有与这个类直接相关的函数放在同一个.py文件里。比如,阅读并不是一个对象,所以我会把它作为一个函数放在书籍类下面,而不是单独放在一个.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.

这个系统的好处是,它更贴近现实。与其把一堆函数放在文件结构里(正如你提到的,这样可能会变得复杂),不如把它们按类分组,形成逻辑上的组合和结构。不过,我认为学生类应该有阅读函数,图书馆类应该有借阅函数,而书籍类只应该有烧毁函数。因为书籍是不能阅读的,阅读的是人;书籍也不能借出,借出的是图书馆。这是一个关于你想如何组织代码的问题。

撰写回答