【问题标题】:How to distribute python classes into different source files without creating many modules?如何在不创建许多模块的情况下将 python 类分发到不同的源文件中?
【发布时间】:2019-07-13 22:29:39
【问题描述】:

我有一些相关的类位于这样的包中:

\cool
  \__init__.py
    class CoolObj: ...
    class CoolStr(CoolObj): ...
    class CoolName(CoolStr): ...
    class CoolSound(CoolObj): ...

我像这样使用这些类:

import cool
cn = cool.CoolName()
...

__init__.py 文件过长。如果我可以像这样将每个类放在他们自己的文件中,那就太好了:

\cool
    \__init__.py
    \cool_obj.py
        class CoolObj: ...
    \cool_str.py
        class CoolStr(CoolStr): ...
    \cool_name.py
        class CoolName(CoolStr): ...
    \cool_sound.py
        class CoolSound(CoolObj): ...

但是,这样一来,这些文件就变成了模块,我必须像下面这样使用它们,这有点冗长。

from cool import cool_obj, cool_str, cool_name, cool_sound
cn = cool_name.CoolName()

有没有什么办法可以将源代码放在单独的文件中,同时还能像我现在这样用简洁的语法来引用它们?

更好的是,python 中是否有任何东西,例如 C# 中的部分类,允许您将同一类的实现分散到不同的文件中?

【问题讨论】:

    标签: python-3.x module package directory-structure


    【解决方案1】:

    在您的__init__.py 中,您可以进行导入以缩短您在其他地方使用它们的方式。所以__init__.py 中的一行可能是

    from cool_name import CoolName
    

    以后你可以做

    from cool import CoolName
    

    您可能还想查看__all__ 作为解决此问题的另一种方法。您可以在 cool.__init__.py 模块中导入各种内容,只要包含 __all__,您就可以明确指定要导出的对象。

    关于部分类,我几乎可以肯定 Python 不通过常规类定义支持这种功能。您可以通过在运行时将不同的函数注入到一个类中来将其组合在一起,但这肯定会很混乱。 This 答案深入研究了这条路径。

    【讨论】:

    • 公平地说,在某个包的__init__.py中导入的任何东西,都变成了可以像在那个包中定义一样使用的东西?
    • 完全正确。如果在__init.py__ 内部定义了一个对象SomeValue = 42,则相当于在其他模块中定义了它,而是使用from other_module import SomeValue 将其导入__init__.py。这通常适用于所有 python 模块,但__init__.py 的好处是可以从 package 导入它。 Python docs 有关于区别的大量信息。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多