【发布时间】:2010-09-11 12:52:57
【问题描述】:
我习惯了 Java 模型,每个文件可以有一个公共类。 Python 没有这个限制,我想知道组织课程的最佳做法是什么。
【问题讨论】:
-
考虑到其他语言的要求和约定,我认为这是一个合理的问题,答案是“
除此之外,这是一个偏好问题 (/opinion)”——那个答案本身并不是一种意见
标签: python class project-structure
我习惯了 Java 模型,每个文件可以有一个公共类。 Python 没有这个限制,我想知道组织课程的最佳做法是什么。
【问题讨论】:
标签: python class project-structure
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 语句描绘的整个组织。
【讨论】:
既然没有人为的限制,那真的取决于什么是可以理解的。如果你有一堆在逻辑上组合在一起的相当短、简单的类,那就扔进一堆。如果您有大型、复杂的类或作为一个组没有意义的类,请为每个类创建一个文件。或者选择介于两者之间的东西。随着事情的变化进行重构。
【讨论】:
我碰巧喜欢 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 Modules documentation 提供了一些关于组织包的有用信息。
【讨论】:
当我对文件的庞大感到恼火并且当相关性的理想结构开始自然出现时,我发现自己在分裂。通常这两个阶段似乎是重合的。
如果你过早拆分事情会很烦人,因为你开始意识到需要完全不同的结构顺序。
另一方面,当任何 .java 或 .py 文件的行数超过 700 行时,我就会开始烦躁,不断地试图记住“那个特定的位”在哪里。
在 Python/Jython 中,import 语句的循环依赖似乎也在起作用:如果您尝试将太多协作的基本构建块拆分到单独的文件中,这种语言的“限制”/“不完美”似乎会迫使您进行分组事情,也许以一种相当明智的方式。
至于拆分成包,我真的不知道,但我想说的是,烦恼和快乐结构出现的相同规则可能适用于所有级别的模块化。
【讨论】:
我会说在该文件中放置尽可能多的类,而不会使其太大和复杂。
【讨论】: