我已经习惯了Java模型,你可以在每个文件中拥有一个公共类.Python没有这个限制,我想知道组织类的最佳实践是什么.
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的模块文件对组织包一些有用的信息.
当我对文件的大小感到恼火,并且当相关性的理想结构开始自然地出现时,我发现自己分裂了.通常这两个阶段似乎是一致的.
如果你过早分裂,可能会非常烦人,因为你开始意识到需要完全不同的结构排序.
另一方面,当任何.java或.py文件超过大约700行时,我开始不断地试图记住"那个特定位"的位置.
使用Python/Jython导入语句的循环依赖似乎也起作用:如果你试图将太多合作的基本构建块拆分成单独的文件,这种语言的"限制"/"不完美"似乎迫使你将事物分组,也许以一种明智的方式.
至于分裂成包,我真的不知道,但我想说可能是同样的烦恼规则和快乐结构的出现在各个层次的模块化中起作用.
我会说把尽可能多的类放在那个文件中可以逻辑地分组,而不会让它太大而复杂.