如何构建Python应用程序结构
我已经做了十年的PHP开发,但觉得学习另一种语言可能是个明智的选择,比如Python。
其实,Python本身并不难理解,尤其是你有编程背景的时候。
不过,我现在还不太明白的是,如何组织我的应用程序,以及如何布局我的类。在PHP中,通常的做法是这样:Vendor\Module\SubModule\Class,这样的结构直接对应到文件系统中的目录和文件,Class.php就是定义这个类的文件。
在Python中,我得到的最接近的结构是:Module.Class,其中Module.py是定义Class的文件。所以在这个结构下,属于这个模块的所有类都应该在Module.py中定义。
我并不想模仿PHP的做法,我只是提供这个作为背景信息。
所以,真正的问题是:在Python中,应用程序的结构应该是什么样的?
编辑
好吧,也许这个问题太宽泛了。为了学习Python,我正在把一些PHP脚本转换成Python。我有一个脚本,它将包含集群信息的文件导入到数据库中。我的PHP结构看起来是这样的:
.
`-- Company
|-- Cluster
| |-- Cluster.php
| |-- Import
| | |-- Array.php
| | `-- Csv.php
| |-- Import.php
| |-- Map.php
| `-- Sync.php
所以我有一个导入接口 Company\Cluster\Import.php,它被两个脚本实现:Company\Cluster\Import\Array.php 和 \Csv.php。
此外,我还有一些类负责处理和准备传入的数据,以便发送给DAO。
那么我该如何在Python中组织这个应用程序呢?
1 个回答
这个问题很开放,但我想说你的问题在于你缺少了“包”的概念。
包就是一个文件夹,里面可以放模块和其他包,这样你可以随意嵌套。为了让Python识别一个文件夹是包,它必须包含一个叫做__init__.py
的文件(目前只需要一个空文件,名字就要这样)。
在Python中,模块就是一个.py
文件。我建议你不要把文件夹(也就是包)命名为模块。
这样一来,你就可以创建任意的结构。例如,假设你的例子是这样的:
main.py
vendor/
__init__.py
mymodule/
__init__.py
mysubmodule/
__init__.py
any_class.py
然后你可以在any_class.py
中定义你的AnyClass
。之后你可以这样从main.py
中导入:
from vendor.mymodule.mysubmodule.any_class import AnyClass
记住,你不一定要明确导入类。你可以导入模块(也就是Python文件)、包,或者你想导入的任何东西。以下的例子都是有效的,虽然不太常见。
import vendor
my_obj = vendor.mymodule.mysubmodule.any_class.AnyClass()
from vendor import mymodule
my_obj = mymodule.mysubmodule.any_class.AnyClass()
...
from vendor.mymodule.mysubmodule import any_class
my_obj = any_class.AnyClass()
还有一点要记住的是,在Python中,你并不被迫每个文件只能有一个类,就像在Java中那样。你可以有多个类,如果它们之间关系紧密,通常把它们放在同一个模块里是有意义的。