相关文章推荐
高大的红薯  ·  Gogs集成LDAP - 知乎·  7 月前    · 
威武的单杠  ·  【已解决】aconda3 ...·  1 年前    · 
小胡子的火锅  ·  [JavaScript] ...·  1 年前    · 

我已经习惯了 Java 的模式,即每个文件可以有一个公有类。 Python没有这个限制,我想知道组织类的最佳做法是什么。

python
class
project-structure
brianegge
brianegge
发布于 2008-09-20
6 个回答
S.Lott
S.Lott
发布于 2008-09-20
已采纳
0 人赞同

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

一个模块是一个独立的东西,它可能有一到二十个密切相关的类。 诀窍在于,模块是你要导入的东西,而你需要这种导入对那些将阅读、维护和扩展你的软件的人来说是完全合理的。

The rule is this: 一个模块是重复使用的单位 .

你不可能轻易地重用一个单一的类。 你应该能够毫无困难地重用一个模块。 你库中的所有东西(以及你下载和添加的所有东西)都是一个模块或一个模块包。

例如,你正在做的事情是读取电子表格,做一些计算,并将结果加载到数据库。 你希望你的主程序是什么样子的?

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

哈哈,我喜欢引号中的 "意义"。
@cdleary: 一个人的感觉就是另一个人的疯狂。 通常情况下,你可以定义合理的模块。 然而,在一个大的应用程序中,总是有多个维度的分析,一个人对另一个人的功能的切片和切块会有分歧。
这个答案实际上并没有回答这个问题,可读性如何,很难阅读里面有超过500行的文件。
Chris Upchurch
Chris Upchurch
发布于 2008-09-20
0 人赞同

由于没有人为的限制,这真的取决于什么是可以理解的。 如果你有一堆相当短的、简单的、有逻辑性的类,就把它们扔在一起。 如果你有大的、复杂的类,或者作为一组没有意义的类,那么每个类就放一个文件。 或者选择介于两者之间的东西。 在事情发生变化时再进行重构。

Raffi Khatchadourian
Raffi Khatchadourian
发布于 2008-09-20
0 人赞同

我碰巧喜欢Java的模式,原因如下。将每个类放在一个单独的文件中,使类在浏览源代码时更容易看到,从而促进了重复使用。如果你把一堆类放在一个文件里,那么对于其他开发者来说,仅仅通过浏览项目的源代码,可能并不清楚那里有可以重用的类。 directory structure .因此,如果你认为你的类有可能被重复使用,我会把它放在自己的文件中。

我完全同意你的观点。在一个文件中拥有几个公有类是不直观的,会使代码难以掌握,就像有人想隐藏结构,有一种被弄得很麻烦的感觉。特别是当你从Java到Python的时候。
特别是如果你从Java到Python。在Python中,他们习惯于在一个文件中抛出许多类)
dbr
dbr
发布于 2008-09-20
0 人赞同

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

例如,我经常使用一系列的类来进行数据抽象--所以我可能有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 。- 如果你从哪里导入的东西是有意义的,而且文件不是有几万行那么长,你的组织方式就正确了。

The Python模块文档 有一些关于组织套餐的有用信息。

破碎的Python模块文档链接。也许 第6.4节 模块.包 is the intended link now?
mike rodent
mike rodent
发布于 2008-09-20
0 人赞同

我发现,当我对文件的庞大程度感到厌烦时,以及当理想的关联性结构开始自然出现时,我就把东西拆开。 通常这两个阶段似乎是重合的。

如果你过早地把事情分割开来,可能会非常恼火,因为你开始意识到需要一个完全不同的结构排序。

另一方面,当任何.java或.py文件超过700行时,我就会开始烦躁,不断试图记住 "那个特定的位子 "在哪里。