我应该在一个文件中放多少个类?

时间:2008-09-20 03:07:02

标签: python class

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

6 个答案:

答案 0 :(得分:307)

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语句描述的整体组织。

答案 1 :(得分:36)

由于没有人为限制,它实际上取决于什么是可理解的。如果你有一堆相当简短的逻辑上组合在一起的类,那就扔掉了。如果您有大型,复杂的类或类作​​为一个组没有意义,请为每个类分配一个文件。或者在中间选择一些东西。随着事情的变化而重构。

答案 2 :(得分:15)

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

答案 3 :(得分:13)

这完全取决于项目的大小,类的长度,是否可以从其他文件中使用等等。

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

将每个文件拆分为单独的文件是愚蠢的 - 但由于它们可以在不同的文件中使用,因此将所有这些放在单独的data_model.py文件中是有意义的,所以我可以{{1} }

如果你有一个包含大量代码的类,也许只有它使用的某些函数,那么将这个类和辅助函数分成一个单独的文件是个好主意。

你应该构建它们,这样你就可以from mypackage.data_model import SomeData, SomeSubData,而不是from mypackage.database.schema import MyModel - 如果你从有意义上导入东西,而且文件不是数万行,你已经组织了它正确。

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

答案 4 :(得分:9)

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

如果你过早分裂,可能会非常烦人,因为你开始意识到需要完全不同的结构排序。

另一方面,当任何.java或.py文件超过大约700行时,我开始不断地试图记住“那个特定位”的位置。

使用Python / Jython导入语句的循环依赖似乎也起作用:如果你试图将太多合作的基本构建块拆分成单独的文件,这种语言的“限制”/“不完美”似乎迫使你进行分组事情,或许是以一种明智的方式。

至于拆分包,我真的不知道,但是我可能会说同样的烦恼规则和快乐结构的出现在各个层次的模块化中都有效。

答案 5 :(得分:5)

我想说要把尽可能多的类放在那个文件中,而不要让它太大而复杂。