我已经习惯了Java模型,你可以在每个文件中拥有一个公共类 . Python没有这个限制,我想知道组织类的最佳实践是什么 .
Python文件被称为“模块”,它是组织软件以使其“有意义”的一种方式 . 另一个是名为“包”的目录 .
模块是一个独特的东西,可能有一两个密切相关的类 . 诀窍是模块是你要导入的东西,你需要导入对于那些阅读,维护和扩展你的软件的人来说是完全明智的 .
规则如下: a module is the unit of reuse .
您不能轻易地重复使用单个类 . 您应该能够毫无困难地重用模块 . 库中的所有内容(以及您下载和添加的所有内容)都是模块或模块包 .
例如,您正在处理读取电子表格的内容,进行一些计算并将结果加载到数据库中 . 您希望主程序看起来像什么?
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 语句进行描绘 .
import
由于没有人为限制,它实际上取决于什么是可理解的 . 如果你有一堆相当简短的逻辑上组合在一起的类,那就折腾成一堆 . 如果您有大型,复杂的类或类作为一个组没有意义,请为每个类分配一个文件 . 或者在中间选择一些东西 . 事情发生变化,重构 .
它完全取决于项目的大小,类的长度,是否可以从其他文件中使用等等 .
例如,我经常使用一系列类来进行数据抽象 - 所以我可能有4或5个类,可能只有1行( class SomeData: pass ) .
class SomeData: pass
将每个文件拆分成单独的文件是愚蠢的 - 但由于它们可以在不同的文件中使用,所以将所有这些放在一个单独的 data_model.py 文件中是有道理的,所以我可以做 from mypackage.data_model import SomeData, SomeSubData
data_model.py
from mypackage.data_model import SomeData, SomeSubData
如果你有一个包含大量代码的类,也许它只使用了一些函数,那么将这个类和辅助函数分成一个单独的文件是个好主意 .
你应该构建它们,以便你做 from mypackage.database.schema import MyModel ,而不是 from mypackage.email.errors import MyDatabaseModel - 如果你从有意义上导入东西,并且文件不是数万行,你已经正确地组织它 .
from mypackage.database.schema import MyModel
from mypackage.email.errors import MyDatabaseModel
Python Modules documentation有一些关于组织包的有用信息 .
我碰巧喜欢Java模型,原因如下 . 将每个类放在单个文件中可以通过在浏览源代码时更容易看到类来促进重用 . 如果你有一堆类被分组到一个文件中,那么对于其他开发人员来说可能并不明显,那里的类可以通过浏览项目的目录结构来重用 . 因此,如果您认为您的类可以重用,我会把它放在自己的文件中 .
当我对文件的大小感到恼火,并且当相关性的理想结构开始自然地出现时,我发现自己分裂了 . 通常这两个阶段似乎是一致的 .
如果你过早地拆分它可能会非常烦人,因为你开始意识到需要完全不同的结构排序 .
另一方面,当任何.java或.py文件超过大约700行时,我开始不断地试图记住“那个特定位”的位置 .
使用Python / Jython循环依赖的import语句似乎也起了作用:如果你试图将太多合作的基本构建块拆分成单独的文件,这种语言的“限制”/“不完美”似乎会迫使你对事物进行分组,也许以一种明智的方式 .
至于分裂成包,我真的不知道,但我会说同样的烦恼规则和快乐结构的出现在所有模块化层面都起作用 .
我会说把尽可能多的类放在那个文件中可以逻辑地分组而不会使它太大而复杂 .
6 回答
Python文件被称为“模块”,它是组织软件以使其“有意义”的一种方式 . 另一个是名为“包”的目录 .
模块是一个独特的东西,可能有一两个密切相关的类 . 诀窍是模块是你要导入的东西,你需要导入对于那些阅读,维护和扩展你的软件的人来说是完全明智的 .
规则如下: a module is the unit of reuse .
您不能轻易地重复使用单个类 . 您应该能够毫无困难地重用模块 . 库中的所有内容(以及您下载和添加的所有内容)都是模块或模块包 .
例如,您正在处理读取电子表格的内容,进行一些计算并将结果加载到数据库中 . 您希望主程序看起来像什么?
将导入视为在概念或块中组织代码的方式 . 确切地说,每次导入中有多少个类都没有用
import
语句进行描绘 .由于没有人为限制,它实际上取决于什么是可理解的 . 如果你有一堆相当简短的逻辑上组合在一起的类,那就折腾成一堆 . 如果您有大型,复杂的类或类作为一个组没有意义,请为每个类分配一个文件 . 或者在中间选择一些东西 . 事情发生变化,重构 .
它完全取决于项目的大小,类的长度,是否可以从其他文件中使用等等 .
例如,我经常使用一系列类来进行数据抽象 - 所以我可能有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模型,原因如下 . 将每个类放在单个文件中可以通过在浏览源代码时更容易看到类来促进重用 . 如果你有一堆类被分组到一个文件中,那么对于其他开发人员来说可能并不明显,那里的类可以通过浏览项目的目录结构来重用 . 因此,如果您认为您的类可以重用,我会把它放在自己的文件中 .
当我对文件的大小感到恼火,并且当相关性的理想结构开始自然地出现时,我发现自己分裂了 . 通常这两个阶段似乎是一致的 .
如果你过早地拆分它可能会非常烦人,因为你开始意识到需要完全不同的结构排序 .
另一方面,当任何.java或.py文件超过大约700行时,我开始不断地试图记住“那个特定位”的位置 .
使用Python / Jython循环依赖的import语句似乎也起了作用:如果你试图将太多合作的基本构建块拆分成单独的文件,这种语言的“限制”/“不完美”似乎会迫使你对事物进行分组,也许以一种明智的方式 .
至于分裂成包,我真的不知道,但我会说同样的烦恼规则和快乐结构的出现在所有模块化层面都起作用 .
我会说把尽可能多的类放在那个文件中可以逻辑地分组而不会使它太大而复杂 .