Python类之间的循环依赖
在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()
- 为什么类会有这个问题,而函数却没有呢?
- 像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
都依赖于另一个调用已经执行过,这种解决办法就不管用了。你需要做更多的修改来解决这个问题。