我应该在一个文件中放入多少个类?[关闭]


274

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


8
考虑到其他语言的要求和约定,我认为这是一个合理的问题答案是“ <定义Python模块和软件包>,除此之外,这是一个优先事项(/ opinion)”- 答案本身并不是一种意见。
david.libremone,2016年

Answers:


333

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陈述中描绘的整体组织。


24
哈哈,我喜欢引语中的“感觉”。
cdleary

27
@cdleary:一个人的感觉是另一个人的疯狂。通常,您可以定义明智的模块。但是,在大型应用程序中,分析总是有多个维度,一个人会在另一个人的功能切片和切块上将头发分开。
S.Lott


4
答案实际上并不能回答问题,关于可读性,很难读取其中包含500行以上的文件。
Vedmant '18年

38

由于没有人为的限制,所以它实际上取决于可理解的内容。如果您有一堆在逻辑上分组在一起的相当短,简单的类,则扔一堆'em。如果您有大型,复杂的类或没有整体意义的类,请每个类一个文件。或在两者之间选择。随着情况的变化进行重构。


23

由于以下原因,我碰巧喜欢Java模型。将每个类放在单独的文件中可通过使类在浏览源代码时更易于查看来促进重用。如果您将一堆类组合到一个文件中,那么对于其他开发人员来说,可能不存在明显的类,这些类可以通过浏览项目的目录结构来重用。因此,如果您认为可以重用您的类,则可以将其放在自己的文件中。


2
我完全同意你的看法。在单个文件中具有多个公共类是很直观的,并且使代码难以掌握,就像有人想要隐藏结构并感觉到很棘手。特别是如果您从Java到Python。
WebComer

特别是如果您从Java到Python。他们曾经在Python中的一个文件中抛出许多类)
WebComer

14

这完全取决于项目的规模,类的时长,是否可以从其他文件中使用它们等等。

例如,我经常使用一系列的类来进行数据抽象-因此我可能有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的模块文件对组织包一些有用的信息。


1
指向Python模块文档的链接断开。也许第6.4节Modules.Packages现在是预期的链接?
cod3monk3y 2014年

9

当我对文件的庞大性感到厌烦,并且当期望的相关性结构开始自然地出现时,我发现自己将事情分解了。通常这两个阶段似乎是重合的。

如果过早地拆分内容,可能会很烦人,因为您开始意识到需要完全不同的结构排序。

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

使用Python / Jython,import语句的循环依赖关系似乎也发挥了作用:如果您尝试将太多相互协作的基本构件拆分成单独的文件,则这种语言的“限制” /“不完美”似乎会迫使您对事物进行分组,也许以一种明智的方式。

至于拆分成多个程序包,我并不是很清楚,但是我想说的是,烦恼和快乐结构的出现同样的规则适用于所有模块化级别。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.