类的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/Keraslayers
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
)是否具有相同名称的类?