类的Python模块结构

类的Python模块结构,python,class,module,Python,Class,Module,我目前正在从事一个项目,我正在以以下方式组织该项目: . ├── example_app │   ├── __init__.py │   ├── app.py │   ├── requirements.txt │   └── classes │   ├── ExampleClass1.py │   ├── ExampleClass2.py │   ├── __init__.py └── tests └── test_app.py 在classes/\uuuuu

我目前正在从事一个项目,我正在以以下方式组织该项目:

.
├── example_app
│   ├── __init__.py
│   ├── app.py
│   ├── requirements.txt
│   └── classes
│       ├── ExampleClass1.py
│       ├── ExampleClass2.py
│       ├── __init__.py
└── tests
    └── test_app.py
classes/\uuuuu init\uuuuuuy.py
中,我为所有其他要继承的“ExampleClasses”定义了一个基类。然后,在
app.py
中,我需要导入所有这些类。但是,这变得非常冗长,因为我必须键入:

from example_app.classes.ExampleClass1 import ExampleClass1
from example_app.classes.ExampleClass2 import ExampleClass2
...
有没有更好的方法来组织这个?理想情况下,我希望将每个类保存在一个单独的文件中,因为它们彼此并不十分相似。我曾想过导入
classes/\uu init.py
中的所有类,但这似乎并不正确


请注意,尽管我只画了两个示例类,但其中可能有几个(几十个),因此手动导入非常麻烦和脆弱。

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

import sys
sys.modules[__name__] = ExampleClassN  # N = 1, 2, ...
那你可以

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


首先,
\uuu init\uuuu.py
不应该包含基类。最好为基类提供单独的文件,因为
\uuuu init\uuuu.py
通常用作模块的初始化

您可以执行以下操作:

  • 使用
    \uuuu init\uuuu.py
    从子模块导入所有类。例如

      import ExampleClass1.ExampleClass1
      import ExampleClass2.ExampleClass2
    
      __all__ = ['ExampleClass1','ExampleClass2']
    
最后,为了使用通配符运算符,例如从类导入*添加以下行


\uuuu all\uuuu=['ExampleClass1','ExampleClass2']
在我看来,从其
\uuu init\uuuuuuu.py
内的子包
类导入所有要公开的类是一条可行的道路。事实上,这正是许多顶级Python库/框架所做的(请参阅TensorFlow/Keras
layers
subpackage和Python的
multiprocessing
subpackage)

但是,在执行此操作时,您可能应该遵循以下步骤:

导入语句仅用于包和模块,不用于 单个类或函数。注意,有一个显式的 从打字模块导入的豁免

在您的情况下,它将转化为:

example\u app/classes/\uuuuuuu init\uuuuuuuuuy

from example_app.classes.ExampleClass1 import ExampleClass1
from example_app.classes.ExampleClass2 import ExampleClass2
# ...
from example_app import classes
# ...
from example_app import classes
ex1_instance = classes.ExampleClass1()
example\u app/\uuuuuuuu init\uuuuuuuuupy

from example_app.classes.ExampleClass1 import ExampleClass1
from example_app.classes.ExampleClass2 import ExampleClass2
# ...
from example_app import classes
# ...
from example_app import classes
ex1_instance = classes.ExampleClass1()
其他一些
.py

from example_app.classes.ExampleClass1 import ExampleClass1
from example_app.classes.ExampleClass2 import ExampleClass2
# ...
from example_app import classes
# ...
from example_app import classes
ex1_instance = classes.ExampleClass1()
或者更好:

import example_app as ex
ex1_instance = ex.classes.ExampleClass1()
您的模块(
ExampleClass*.py
)是否具有相同名称的类?