Python中的循环依赖

Circular dependency in Python

我有两个文件,node.pypath.py分别定义了两个类:NodePath

到今天为止,Path的定义引用了Node对象,因此我已经这样做了。

1
from node.py import *

path.py文件中。

但是,到今天为止,我为Node创建了一个引用Path对象的新方法。

我在导入path.py时遇到了一些问题:我尝试过,当程序运行并调用使用NodePath方法时,一个关于Node未定义的异常出现了。

我该怎么办?


导入python模块是一篇很好的文章,它解释了python中的循环导入。

解决此问题的最简单方法是将路径导入移动到节点模块的末尾。


另一种方法是只在您需要的函数中导入两个模块中的一个。当然,如果您只在一个或一小部分函数中需要它,那么这是最有效的:

1
2
3
4
5
6
7
8
9
10
11
# in node.py
from path import Path
class Node
    ...

# in path.py
class Path
  def method_needs_node():
    from node import Node
    n = Node()
    ...


我更喜欢通过在另一个依赖类的构造函数中声明一个依赖项来打破循环依赖项。在我看来,这可以保持代码整洁,并且可以方便地访问所有需要依赖项的方法。

所以在我的例子中,我有一个客户服务和一个相互依赖的用户服务。我将循环依赖项分解如下:

1
2
3
4
5
6
7
8
9
10
class UserService:

    def __init__(self):
        # Declared in constructor to avoid circular dependency
        from server.portal.services.admin.customer_service import CustomerService
        self.customer_service = CustomerService()

    def create_user(self, customer_id: int) -> User:
        # Now easy to access the dependency from any method
        customer = self.customer_service.get_by_id(customer_id)