1

下面的代码可用于打破 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();
      //...
   }
}
4

1 回答 1

2

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

在 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 没有什么不同......)

于 2013-08-28T23:25:35.867 回答