通过接口打破Python中的循环依赖

时间:2013-08-28 23:20:40

标签: java python circular-dependency

下面的代码可用于破坏Java中的循环依赖。

Pythonic的方式是什么?

interface A {
   int A1();
}


class X implements A {
   B b;

   public int X1() {
      b = B(this);
      b.doSomething();
   }

   public int A1() { ... }
}

class B {
   A a;
   public B(A a) {
      this.a = a;
   }

   public doSomething() {
      //...
      this.a.A1();
      //...
   }
}

1 个答案:

答案 0 :(得分:2)

最简单,通常最pythonic的方法是依赖duck类型,因此静态代码中的依赖关系并不明确,并且没有循环性。

在Java中需要接口的原因是因为Java强制B类为其a成员提供静态类型,对于其构造函数的a参数也是如此。在Python中没有必要,因为变量没有类型(当然值,但任何变量都可以包含任何类型的值)。如果你想明确强制检查,你可以 ,使用abc)作为接口...但它确实不会给你买任何东西。最好让鸭子成为鸭子:

class X(object):
    def x1(self):
        self.b = B(self)
        self.b.do_something()
    def a1(self):
        # ...

class B(object):
    def __init__(self, a):
        self.a = a
    def do_something(self):
        self.a.a1()

当然还有动态循环,但这不是问题。 (好吧,循环引用可能是一个问题,但通常不会,这不是你担心的问题,它与Java没有什么不同......)