3

我在 Python 应用程序的 MVC 模式的模型部分中构建类时遇到问题。无论我如何处理事情,我都会遇到循环导入。这是我所拥有的:

模型/__init__p.y

  • 应该包含所有模型类名称,以便我可以执行“从模型导入用户”,例如从控制器或单元测试用例

模型/数据库.py

  • 持有数据库类
  • 需要导入所有 Model 类来做 ORM
  • 初始化应该在第一个模块导入时执行,即没有额外的初始化调用或实例化(数据库类上的所有方法都是@classmethods)

模型/用户.py

  • 包含用户模型类
  • 需要访问数据库类进行查询
  • 应该从所有模型类共有的基类继承以共享功能(数据库持久性方法、参数验证代码等)

我还没有看到使用 MVC 的真实世界 Python 应用程序,所以我的方法可能是非 Pythonic(并且可能是与语言无关的混乱......) - 关于如何解决这个问题的任何建议?

谢谢,西蒙

4

3 回答 3

7

你的规范有不一致的地方。你说 Database.py 需要导入所有 Model 类来执行 ORM,但是你说 User 类需要访问数据库来执行查询。

将这些视为 API 的层。Database 类为某些物理持久层(例如 DB-API 2.0)提供了一个 API(可能是面向对象的)。模型类,如用户,使用数据库层来加载和保存它们的状态。Database.py 类没有理由导入所有 Model 类,实际上您不希望这样做,因为每次创建新 Model 类时都必须修改 Database.py - 这是一种代码味道.

于 2008-10-09T02:22:03.623 回答
3

通常,我们将所有内容放在一个文件中。这不是 Java 或 C++。

从单个文件开始,直到您获得更多 Python 经验。除非您的文件非常庞大,否则它将正常工作。

例如,Django 鼓励这种风格,所以复制他们的成功公式。模型的一个模块。每个应用程序的一个模块;每个应用程序导入一个通用模型。

你的数据库和超类的东西可以在你的__init__.py文件中,因为它适用于整个包。这可能会减少一些循环性。

于 2008-10-08T23:55:10.597 回答
1

我认为你有一个问题需要解决。循环引用通常是由于未能实现关注点分离而导致的。在我看来,数据库和模型模块不应该相互了解太多,而是使用 API。在这种情况下,数据库不应该直接引用任何特定的模型类,而是提供模型类需要运行的功能。反过来,模型应该获得一个数据库引用(注入或请求),它将用于查询和持久化自身。

于 2008-10-09T00:28:18.767 回答