Pythonic组织模块和软件包的方式

我来自一个背景,我通常每个class级创build一个文件。 我也在目录下组织普通的类。 这种做法对我来说很直观,已被certificate在C ++,PHP,JavaSript等方面是有效的。

我很难把这个隐喻带入Python:文件不再是文件,而是正式的模块。 在一个模块中只有一个类是不正确的 – 大多数类都是自己无用的。 如果我有一辆automobile.py ,一辆Automobile ,总是把它称为automobile.Automobileautomobile.Automobile也是很愚蠢的。

但是,与此同时,将一吨代码放入一个文件并称之为一天似乎并不合适。 显然,一个非常复杂的应用程序应该有超过5个文件。

什么是正确的或pythonic的方式? (或者如果没有正确的方法,你最喜欢的方式是什么?为什么?)我应该在Python模块中投入多less代码?

想象一下“包装的逻辑单元” – 可能是一个单一的类,但更经常的是一组密切合作的类。 类(或模块级函数 – 当模块级函数也可以作为select时总是使用静态方法不要“在Python中执行Java” – )可以根据这个标准进行分组。 基本上,如果A的大多数用户也需要B,反之亦然,A和B应该可能在同一模块中; 但是如果许多用户只需要其中的一个,而不需要另外一个,那么他们应该可能位于不同的模块中(可能在同一个包中,即带有__init__.py文件的目录)。

标准的Python库虽然远非完美,但往往反映出(大部分)合理的良好实践 – 所以你可以通过实例来学习。 例如, threading模块当然定义了一个Thread类……但是它也包含了诸如锁,事件,条件和信号量之类的同步原语类,以及可由线程操作引发的exception类更多的东西)。 它处于合理大小(800行,包括空格和文档string)的上限,并且一些关键的与线程相关的function,例如Queue已经被放置在一个单独的模块中,不过它是一个很好的例子,打包成一个单一的模块。

如果你是从c ++的angular度来看,你可以查看类似于.so或.dll的python模块。 是的,他们看起来像源文件,因为python脚本,但他们实际上是可载入特定function的库。

另一个可能会帮助你的隐喻是你可能把python模块看作命名空间。

如果你想坚持你的一个单一的文件系统(这是合乎逻辑的,不要误解我的意思),你可以这样做,以避免不得不引用automobile.Automobile

 from automobile import Automobile car = Automobile() 

但是,正如cobbal所提到的,每个文件不止一个类在Python中是很常见的。 无论哪种方式,只要你select一个合理的系统,并坚持使用它,我不认为任何Python用户会对你生气:)。

在一个中等规模的项目中,我发现自己有几套密切相关的课程。 现在几个这样的组合被分组成文件; 例如,低级networking类都在单个network模块中。 然而,一些最大的类别已经被分成了自己的文件。

也许最好的办法是从一个一个一个文件的历史logging开始,把你通常放在同一个目录中的类放在同一个文件中。 如果该文件开始看起来太大,分割它。

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

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