在模块和/或包中组织Python类

时间:2010-10-01 19:58:32

标签: python class module package

我喜欢每个文件都有一个公共类的Java约定,即使有时候有充分的理由将多个公共类放入一个文件中。在我的情况下,我有相同的接口的替代实现。但是,如果我将它们放在单独的文件中,我会在import语句中使用冗余名称(或误导模块名称):

import someConverter.SomeConverter

someConverter将是文件(和模块)名称,SomeConverter是类名。这看起来非常不优雅。将所有替代类放入一个文件将导致更有意义的import语句:

import converters.SomeConverter

但是如果我把所有相关的类放到一个模块文件中,我担心文件会变得很大。这里的Python最佳实践是什么?每个文件一个类是不寻常的?

3 个答案:

答案 0 :(得分:58)

很多是个人偏好。使用python模块,您可以选择将每个类保存在单独的文件中,并仍然允许import converters.SomeConverter(或from converters import SomeConverter

您的文件结构可能如下所示:

* converters
     - __init__.py
     - baseconverter.py
     - someconverter.py
     - otherconverter.py

然后在您的__init__.py文件中:

from baseconverter import BaseConverter
from otherconverter import OtherConverter

答案 1 :(得分:41)

Zach的解决方案在Python 3上打破。这是一个固定的解决方案。

很多是个人偏好。使用python模块,您可以选择将每个类保存在单独的文件中,并仍然允许import converters.SomeConverter(或from converters import SomeConverter

您的文件结构可能如下所示:

* converters
     - __init__.py
     - baseconverter.py
     - someconverter.py
     - otherconverter.py

然后在您的__init__.py文件中:

from converters.baseconverter import BaseConverter
from converters.otherconverter import OtherConverter

答案 2 :(得分:1)

上述解决方案很好,但是在__init__.py中导入模块存在的问题是,这将导致所有模块加载两次(效率低下)。尝试在otherconverter.py的末尾添加打印语句,然后运行otherconverter.py。 (您会看到print语句执行了两次)

我更喜欢以下内容。使用名称为“ _converter”的另一个包并在其中定义所有内容。然后,您的“ converters.py”成为访问所有公共成员的界面

* _converters
     - __init__.py
     - baseconverter.py
     - someconverter.py
     - otherconverter.py

*  converters.py

converters.py在哪里

from _converters.someconverter import SomeConverter
from _converters.otherconverter import OtherConverter
...
...
...
converters = [SomeConverter, OtherConverter, ...]

正如前面提到的解决方案,这是个人选择。一些实践涉及在包中定义模块“ interace.py”并将所有公共成员导入此处。如果要加载的模块很多,则应该选择效率而非美观。