45

我来自通常每个班级创建一个文件的背景。我也在目录下组织公共类。这种做法对我来说很直观,并且已被证明在 C++、PHP、JavaSript 等中是有效的。

我很难将这个隐喻带入 Python:文件不再只是文件,而是正式的模块。在一个模块中只包含一个类似乎是不对的——大多数类本身是无用的。如果我有一个automobile.py和一个Automobile类,那么总是引用它似乎很愚蠢automobile.Automobile

但是,与此同时,将大量代码放入一个文件并收工似乎并不正确。显然,一个非常复杂的应用程序应该有 5 个以上的文件。

什么是正确的——或pythonic——方式?(或者如果没有正确的方法,您首选的方法是什么,为什么?)我应该在 Python 模块中输入多少代码?

4

5 回答 5

36

考虑“包装的逻辑单元”——它可能是一个类,但更多时候是一组紧密合作的类。类(或模块级函数——当模块级函数也可用作选择时,不要总是使用静态方法来“在 Python 中执行 Java”!-)可以基于此标准进行分组。基本上,如果 A 的大多数用户也需要 B,反之亦然,那么 A 和 B 应该在同一个模块中;但是如果许多用户只需要其中一个而不需要另一个,那么他们可能应该位于不同的模块中(可能在同一个包中,即其中包含__init__.py文件的目录)。

标准 Python 库虽然远非完美,但往往反映(大部分)相当好的实践——因此您可以通过示例从中学习。例如,该threading模块当然定义了一个Thread类......但它也包含同步原语类,如锁、事件、条件和信号量,以及一个可以由线程操作引发的异常类(以及其他一些东西) )。它处于合理大小的上限(800 行,包括空格和文档字符串),并且一些与线程相关的关键功能(例如 Queue)已放置在单独的模块中,但它是一个很好的例子,说明它仍然有意义的最大功能量打包成一个模块。

于 2009-11-26T07:02:23.417 回答
10

如果你想坚持你的每个文件一个类的系统(这是合乎逻辑的,不要误会我的意思),你可能会做这样的事情来避免不得不参考automobile.Automobile

from automobile import Automobile
car = Automobile()

然而,正如 cobbal 所提到的,每个文件不止一个类在 Python 中很常见。无论哪种方式,只要您选择一个合理的系统并始终如一地使用它,我认为任何 Python 用户都不会生您的气 :)。

于 2009-11-26T06:48:46.253 回答
8

如果您从 c++ 的角度来看,您可以查看类似于 .so 或 .dll 的 python 模块。是的,它们看起来像源文件,因为 python 是脚本化的,但它们实际上是具有特定功能的可加载库。

另一个可能有帮助的比喻是您可能将 python 模块视为名称空间。

于 2009-11-26T07:06:51.333 回答
4

在一个中型项目中,我发现自己有几组密切相关的类。其中一些集合现在被分组到文件中;例如,低级网络类都在一个network模块中。但是,一些最大的类已被拆分到自己的文件中。

也许从每个文件一个类的历史开始走这条路的最好方法是采用通常放置在同一目录中的类,而不是将它们保存在同一个文件中。如果该文件开始看起来太大,请将其拆分。

于 2009-11-26T06:59:17.090 回答
3

作为一个模糊的指导方针:每个文件超过 1 个类是 python 的规范

另外,请参阅我应该在一个文件中放入多少个 Python 类?

于 2009-11-26T06:39:59.220 回答