关于python:我应该在一个文件中放多少个类?

How many classes should I put in one file?

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


python文件被称为"模块",它是组织软件以使其"有意义"的一种方法。另一个是一个叫做"包"的目录。

一个模块是一个独特的东西,它可能有一到二十个密切相关的类。诀窍是,模块是您将要导入的东西,并且您需要该导入对将阅读、维护和扩展您的软件的人非常敏感。

规则是:模块是重用的单元。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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声明描述的整个组织。


因为没有人为的限制,它实际上取决于什么是可理解的。如果你有一堆逻辑上分组在一起的相当短、简单的类,那么就把它们放在一起。如果你有大的、复杂的类或者作为一个组没有意义的类,那么就每个类放一个文件。或者在中间挑点什么。随着事物的变化而重构。


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


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

例如,我经常使用一系列类来提取数据,所以我可能有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模块文档提供了一些关于组织包的有用信息。


当我对文件的庞大感到恼火时,以及当所需的关联结构开始自然出现时,我发现自己正在把事情分开。通常这两个阶段似乎是一致的。

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

另一方面,当任何.java或.py文件的长度超过700行时,我总是会不断地试图记住"特定的位"在哪里。

有了python/jython,导入语句的循环依赖性似乎也扮演了一个角色:如果您试图将太多协作的基本构建块分割成单独的文件,那么这种语言的"限制"/"不完善"似乎会迫使您对事物进行分组,也许这是一种相当明智的方式。

至于拆分成包,我不太清楚,但我想说的可能是,烦恼的规则和快乐结构的出现在模块化的各个层次上都起作用。


我想说,在该文件中放入尽可能多的逻辑分组类,而不要使它太大和太复杂。