Python类之间的循环依赖

14 投票
2 回答
11473 浏览
提问于 2025-04-18 02:27

在Python中,类的定义可以相互依赖,像这样:

 # This is not fine
 class A():
     b = B().do_sth();
     def do_sth(self):
         pass

 class B():
     a = A().do_sth();
     def do_sth(self):
         pass

 # This is fine
 def FuncA():
     b = FuncB()

 def FuncB():
     a = FuncA()
  1. 为什么类会有这个问题,而函数却没有呢?
  2. 像C++这样的语言有声明,比如 class B 来解决这种依赖问题,Python有没有类似的东西呢?

2 个回答

3

类会出现这些问题,是因为在类的定义阶段(比如说 b = B.do_smth()),类级别的指令会被执行,而不是在你创建这个类的实例时才执行。

你可以在定义完两个类之后再完成一个类的定义。毕竟,Python是一种动态语言。

14

在函数的情况下,我们其实不需要在定义FuncA的时候就调用FuncB。FuncB只有在我们真正调用FuncA的时候才需要被调用。

和函数不同,类的内容是在定义的时候就会执行的。要定义类A,我们需要实际调用类B的方法,但因为类B还没定义,所以我们不能这么做。

为了解决这个问题,我们可以先定义类,然后再添加属性:

class A(object):
    ...

class B(object):
    ...

A.b = B.do_sth()
B.A = A.do_sth()

不过,如果每次调用do_sth都依赖于另一个调用已经执行过,这种解决办法就不管用了。你需要做更多的修改来解决这个问题。

撰写回答