292

我习惯了 Java 模型,每个文件可以有一个公共类。Python 没有这个限制,我想知道组织类的最佳实践是什么。

4

6 回答 6

353

Python 文件称为“模块”,它是组织软件的一种方式,以使其“有意义”。另一个是目录,称为“包”。

一个模块是一个独特的东西,可能有一个或两个密切相关的类。诀窍是模块是您将要导入的东西,并且您需要该导入对于将阅读、维护和扩展您的软件的人来说是完全明智的。

规则是这样的:模块是重用单元

你不能轻易地重用一个类。您应该能够毫无困难地重用模块。您库中的所有内容(以及您下载和添加的所有内容)要么是一个模块,要么是一个模块包。

例如,您正在处理读取电子表格、进行一些计算并将结果加载到数据库中的东西。你希望你的主程序是什么样的?

from ssReader import Reader
from theCalcs import ACalc, AnotherCalc
from theDB import Loader

def main( sourceFileName ):
    rdr= Reader( sourceFileName )
    c1= ACalc( options )
    c2= AnotherCalc( options )
    ldr= Loader( parameters )
    for myObj in rdr.readAll():
        c1.thisOp( myObj )
        c2.thatOp( myObj )
        ldr.laod( myObj )

将导入视为将代码组织成概念或块的方式。每个导入中有多少类并不重要。重要的是你用你的import陈述描绘的整体组织。

于 2008-09-20T10:27:39.860 回答
40

既然没有人为的限制,那真的要看什么是可以理解的。如果你有一堆在逻辑上组合在一起的相当短、简单的类,那就扔进一堆。如果您有大型、复杂的类或作为一个组没有意义的类,请为每个类创建一个文件。或者选择介于两者之间的东西。随着事情的变化进行重构。

于 2008-09-20T03:11:04.807 回答
25

我碰巧喜欢 Java 模型,原因如下。将每个类放在一个单独的文件中,通过使浏览源代码时更容易看到类来促进重用。如果您将一堆类分组到一个文件中,那么其他开发人员可能不会很明显地通过浏览项目的目录结构就可以重用那里的类。因此,如果你认为你的类可能被重用,我会把它放在它自己的文件中。

于 2011-10-24T16:50:01.740 回答
15

这完全取决于项目有多大,类有多长,是否会从其他文件中使用它们等等。

例如,我经常使用一系列类进行数据抽象——所以我可能有 4 或 5 个可能只有 1 行长的类 ( class SomeData: pass)。

将它们中的每一个拆分成单独的文件会很愚蠢 - 但由于它们可能会从不同的文件中使用,所以将所有这些放在一个单独的data_model.py文件中是有意义的,所以我可以这样做from mypackage.data_model import SomeData, SomeSubData

如果你有一个包含大量代码的类,可能只有它使用的一些函数,最好将这个类和辅助函数拆分到一个单独的文件中。

您应该构建它们以便您这样做from mypackage.database.schema import MyModel,而不是from mypackage.email.errors import MyDatabaseModel- 如果您从哪里导入东西是有意义的,并且文件不是数万行长,那么您已经正确组织了它。

Python Modules 文档有一些关于组织包的有用信息。

于 2008-11-30T06:57:32.723 回答
10

当我对文件的庞大感到恼火并且当相关性的理想结构开始自然出现时,我发现自己正在分裂。通常这两个阶段似乎是重合的。

如果你过早拆分事情可能会很烦人,因为你开始意识到需要完全不同的结构顺序。

另一方面,当任何 .java 或 .py 文件的行数超过 700 行时,我开始感到恼火,不断地试图记住“那个特定的位”在哪里。

使用 Python/Jython 的 import 语句的循环依赖似乎也起作用:如果您尝试将太多协作的基本构建块拆分到单独的文件中,这种语言的“限制”/“不完美”似乎会迫使您将事物分组,也许以一种相当明智的方式。

至于拆分成包,我真的不知道,但我想说的是,可能同样的烦恼和快乐结构的出现规则适用于所有级别的模块化。

于 2011-11-11T18:49:05.837 回答
7

我会说在该文件中放置尽可能多的类,而不会使其太大和复杂。

于 2008-09-20T03:08:45.187 回答