【问题标题】:Python module structure for classes类的 Python 模块结构
【发布时间】:2021-02-11 09:54:38
【问题描述】:

我目前正在按以下方式构建一个项目:

.
├── example_app
│   ├── __init__.py
│   ├── app.py
│   ├── requirements.txt
│   └── classes
│       ├── ExampleClass1.py
│       ├── ExampleClass2.py
│       ├── __init__.py
└── tests
    └── test_app.py

classes/__init__.py 内部,我定义了一个基类,供所有其他“ExampleClasses”继承。然后,在app.py 内部,我需要导入所有这些类。但是,这变得非常冗长,因为我必须输入:

from example_app.classes.ExampleClass1 import ExampleClass1
from example_app.classes.ExampleClass2 import ExampleClass2
...

有没有办法以更好的方式来构建它?理想情况下,我想将每个类保存在一个单独的文件中,因为它们彼此并不相似。我想导入classes/__init.py 中的所有类,但这似乎不对。

请注意,虽然我只描绘了 2 个示例类,但它们可能有几个(数十个),因此手动导入非常麻烦和脆弱。

【问题讨论】:

  • 您的模块 (ExampleClass*.py) 有同名的类?

标签: python class module


【解决方案1】:

在我看来,从子包classes 中的__init__.py 中导入所有要公开的类是可行的方法。事实上,这就是许多顶级 Python 库/框架所做的(参见 TensorFlow/Keras layers 子包 here 和 Python 的 multiprocessing 子包 here)。

但是,在这样做时,您可能应该关注Google Python Style Guide 并且:

只对包和模块使用 import 语句,而不是 单独的类或函数。请注意,有一个明确的 来自打字模块的进口豁免。

在你的情况下,它会转化为:

example_app/classes/__init__.py:

from example_app.classes.ExampleClass1 import ExampleClass1
from example_app.classes.ExampleClass2 import ExampleClass2

example_app/__init__.py:

# ...
from example_app import classes
# ...

其他一些.py

from example_app import classes
ex1_instance = classes.ExampleClass1()

甚至更好:

import example_app as ex
ex1_instance = ex.classes.ExampleClass1()

【讨论】:

    【解决方案2】:

    您可以将模块视为一个类。如果你的模块ExampleClassN.py只是定义一个类ExampleClassN,只需在每个模块的末尾添加以下两行即可。

    import sys
    sys.modules[__name__] = ExampleClassN  # N = 1, 2, ...
    

    那你就可以了

    from example_app.classes import ExampleClass1
    from example_app.classes import ExampleClass2
    ...
    

    from example_app.classes import (
        ExampleClass1,
        ExampleClass2,
        ...
    )
    

    from example_app.classes import *
    

    【讨论】:

      【解决方案3】:

      首先,__init__.py 不应包含您的基类。基类最好有单独的文件,__init__.py 通常用作模块的初始化。

      您可以执行以下操作:

      • 使用__init__.py 从子模块中导入所有类。例如。

          import ExampleClass1.ExampleClass1
          import ExampleClass2.ExampleClass2
        
          __all__ = ['ExampleClass1','ExampleClass2']
        

      最后为了使用通配符运算符,例如from classes import *你需要添加以下行

      __all__ = ['ExampleClass1','ExampleClass2']

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        • 2014-01-08
        • 1970-01-01
        相关资源
        最近更新 更多