下面的代码可用于破坏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();
//...
}
}
答案 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没有什么不同......)