2013-08-28 70 views
0

下面的代碼可用於打破Java中的循環依賴關係。通過接口打破Python中的循環依賴關係

這是什麼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(); 
     //... 
    } 
} 

回答

2

最簡單的,和平時最Python化的方式做到這一點是依靠鴨打字,所以依賴是不是在靜態代碼明確,沒有圓。

您需要的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沒有區別......)