【问题标题】:Circular dependency between python classespython类之间的循环依赖
【发布时间】:2019-02-04 06:37:34
【问题描述】:

在 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有类似的结构吗?

【问题讨论】:

  • A.do_sth()B.do_sth() 即使没有循环依赖也无法工作。您正在尝试在类本身上调用实例方法。
  • @user2357112 我很粗心。问题已编辑。

标签: python


【解决方案1】:
  1. 类有这些问题,因为类级别的指令 (b = B.do_smth()) 在定义类时执行,而不是在创建类的实例时执行
  2. 在定义了两个类之后,您可以在最近完成一个类的定义。 Python 毕竟是一种动态语言。

【讨论】:

    【解决方案2】:

    在函数的情况下,我们实际上不必调用 FuncB 来定义 FuncA。只有当我们真正调用 FuncA 时才需要调用 FuncB。

    与函数不同,类的主体在定义时执行。要定义 A 类,我们需要实际调用 B 方法,因为 B 类还没有定义,所以我们不能这样做。

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

    class A(object):
        ...
    
    class B(object):
        ...
    
    A.b = B.do_sth()
    B.A = A.do_sth()
    

    但是,如果每个 do_sth 调用都依赖于已经执行的另一个调用,则此解决方案将不起作用。您将需要执行更广泛的更改来解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2019-04-30
      相关资源
      最近更新 更多