代码之家  ›  专栏  ›  技术社区  ›  carl

组织模块和包的蟒蛇式方法

  •  39
  • carl  · 技术社区  · 16 年前

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

    我很难将这个比喻引入到Python中:文件不再只是文件,而是正式的模块。在一个模块中只有一个类似乎是不对的——大多数类本身都是无用的。如果我有 automobile.py 和一个 Automobile 类,总是将其引用为 automobile.Automobile 也。

    但是,同时,将大量的代码放到一个文件中并每天调用它似乎是不对的。显然,非常复杂的应用程序应该有5个以上的文件。

    正确的(或蟒蛇式的)方式是什么?(或者,如果没有正确的方法,你的首选方法是什么?为什么?)我应该在一个Python模块中投入多少代码?

    5 回复  |  直到 14 年前
        1
  •  32
  •   Alex Martelli    16 年前

    以“包装的逻辑单元”来考虑——它可能是一个单独的类,但更经常是一组密切合作的类。类(或模块级函数)——当模块级函数也可以作为选择时,始终使用静态方法不做“Python中的Java”!-)可以根据此条件分组。基本上,如果A的大多数用户也需要B,反之亦然,那么A和B可能在同一个模块中;但是如果许多用户只需要其中一个而不需要另一个,那么他们可能在不同的模块中(可能在同一个包中,即目录 __init__.py 文件在其中)。

    标准的python库虽然远不是完美的,但往往反映(大部分)相当好的实践——所以您可以通过示例从中学习。例如 threading 模块当然定义了 Thread 班…但它还包含同步原语类,如锁、事件、条件和信号量,以及线程操作(以及其他一些操作)可以引发的异常类。它位于合理大小的上限(800行,包括空格和docstring),一些与线程相关的关键功能(如queue)已放置在单独的模块中,不过它是一个很好的例子,说明将多大的功能打包到单个模块中仍然是有意义的。

        2
  •  8
  •   Conrad Meyer    16 年前

    如果您想坚持每个文件系统一个类(这是合乎逻辑的,请不要误会我),您可以这样做以避免引用 automobile.Automobile :

    from automobile import Automobile
    car = Automobile()
    

    但是,正如cobbal所提到的,每个文件有多个类在Python中非常常见。不管怎样,只要你选择一个合理的系统并始终如一地使用它,我认为没有任何一个Python用户会生你的气。

        3
  •  8
  •   mtvee    16 年前

    如果来自C++视图,可以查看类似于.SO或.DLL的Python模块。是的,它们看起来像源文件,因为python是脚本化的,但实际上它们是具有特定功能的可加载库。

    另一个可能有用的比喻是,您可能将Python模块视为名称空间。

        4
  •  4
  •   eswald    16 年前

    在一个中等规模的项目中,我发现自己有几组密切相关的类。这些集合中的一些现在被分组成文件;例如,低级网络类都在一个单独的类中 network 模块。然而,一些最大的类被分割成自己的文件。

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

        5
  •  3
  •   Community Mohan Dere    9 年前

    作为一个模糊的准则:每个文件超过一个类是Python的规范

    另请参见 How many Python classes should I put in one file?

    推荐文章