Python中的MVC模型结构
-
06-07-2019 - |
题
我在 Python 应用程序的 MVC 模式的模型部分构建类时遇到问题。无论我如何改变事情,我都会遇到循环导入。这是我所拥有的:
模型/__init__p.y
- 应该保留所有模型类名称,以便我可以做一个“从模型导入用户”从控制器或单元测试案例
模型/数据库.py
- 持有数据库类
- 需要导入所有Model类来进行ORM
- 初始化应该在第一个模块导入时执行,即没有额外的初始化调用或实例化(数据库类上的所有方法都是@classmethods)
模型/用户.py
- 包含用户模型类
- 需要访问数据库类来进行查询
- 应继承所有模型类共有的基类以共享功能(数据库持久性方法、参数验证代码等)
我还没有看到现实世界中使用 MVC 的 Python 应用程序,所以我的方法可能不是 Pythonic 的(而且可能是与语言无关的混乱......) - 关于如何解决这个问题有什么建议吗?
谢谢,西蒙
解决方案
您的规范存在不一致之处。你说 Database.py 需要导入所有 Model 类来执行 ORM,但你又说 User 类需要访问数据库来执行查询。
将它们视为 API 的层。Database 类为某些物理持久层(例如 DB-API 2.0)提供 API(可能是面向对象的)。模型类(如用户)使用数据库层来加载和保存其状态。Database.py 类没有理由导入所有 Model 类,事实上您也不希望这样做,因为每次创建新的 Model 类时都必须修改 Database.py - 这是一种代码味道。
其他提示
一般来说,我们把它们全部放在一个文件中。这不是 Java 或 C++。
从单个文件开始,直到您获得更多 Python 经验。除非您的文件非常庞大,否则它会正常工作。
例如,Django 鼓励这种风格,所以复制他们的成功公式。模型的一个模块。每个应用程序都有一个模块;每个应用程序都会导入一个通用模型。
您的数据库和超类内容可以在您的 __init__.py
文件,因为它适用于整个包。这可能会减少一些循环。
我认为你有一个问题需要解决。循环引用通常是由于未能实现关注点分离而导致的。在我看来,数据库和模型模块不应该彼此了解太多,而应该针对 API 进行工作。在这种情况下,数据库不应直接引用任何特定的模型类,而是提供模型类运行所需的功能。反过来,模型应该获取一个数据库引用(注入或请求),用于查询和持久化自身。