我在 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 进行工作。在这种情况下,数据库不应直接引用任何特定的模型类,而是提供模型类运行所需的功能。反过来,模型应该获取一个数据库引用(注入或请求),用于查询和持久化自身。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top