2013-08-28 3 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

Самый простой, и, как правило, наиболее вещий, способ сделать это, чтобы полагаться на утиной типизации, поэтому зависимости не явно в статическом коде и нет округлости.

Причина вам нужен интерфейс в 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 ...)

Смежные вопросы