2015-03-03 147 views
4
Class BigClassA: 
     def __init__(self): 
      self.a = 3 
     def foo(self): 
      self.b = self.foo1() 
      self.c = self.foo2() 
      self.d = self.foo3() 
     def foo1(self): 
      # do some work using other methods not listed here 
     def foo2(self): 
      # do some work using other methods not listed here 
     def foo3(self): 
      # do some work using other methods not listed here 

    Class BigClassB: 
     def __init__(self): 
      self.b = # need value of b from BigClassA 
      self.c = # need value of c from BigClassA 
      self.d = # need value of d from BigClassA 
     def foo(self): 
      self.f = self.bar() 
     def bar(self): 
      # do some work using other methods not listed here and the value of self.b, self.c, and self.d 


    Class BigClassC: 
     def __init__(self): 
      self.b = # need value of b from BigClassA 
      self.f = # need value of f from BigClassB 
     def foo(self): 
      self.g = self.baz() 
     def baz(self): 
      # do some work using other methods not listed here and the value of self.b and self.g 

問題: 基本上我有3個類有很多的方法,它們有點依賴,你可以從代碼中看到。如何將BigClassA中的實例變量self.b,self.c,self.d的值分享給BigClassB?Python:如何在不同類的實例之間共享數據?

nb:這3個類不能彼此繼承,因爲它沒有意義。

我想到的只是將所有方法合併爲一個超級大類。但我不認爲這是一個正確的方式來做到這一點。

+0

'類BigClassB(BigClassA):'和'類BigClassC(BigClassA,BigClassB)'。使用繼承 – ForceBru 2015-03-03 11:50:00

+1

您可以嘗試使用構圖。那就是當你在B類的一個實例中實例化一個類A的對象時。這樣你就可以擁有連接,而不用說其中的一個是專門化的。 [閱讀](http://learnpythonthehardway.org/book/ex44.html)。除此之外,您可以發送類A的對象並將您需要的屬性分配給類B中的新屬性。儘管這可能會破壞數據一致性。 – ljetibo 2015-03-03 11:50:07

+0

你想分享每個班級的實例還是全球的數據? – 2015-03-03 11:50:36

回答

5

你是對的,在你的情況下繼承沒有意義。但是,在實例化過程中如何顯式傳遞對象。這會很有意義。

喜歡的東西:

Class BigClassA: 
    def __init__(self): 
     .. 
Class BigClassB: 
    def __init__(self, objA): 
     self.b = objA.b 
     self.c = objA.c 
     self.d = objA.d 

Class BigClassC: 
    def __init__(self, objA, objB): 
     self.b = objA.b # need value of b from BigClassA 
     self.f = objB.f # need value of f from BigClassB 

在實例,這樣做:

objA = BigClassA() 
.. 
objB = BigClassB(objA) 
.. 
objC = BigClassC(objA, objB) 
+0

有趣的是,這是什麼樣的設計或模式?這是常見的事情,還是有更好的方法來解決問題? – 2015-03-03 11:59:28

+1

@ user74158即使有名字也可能太常見了。 – 2015-03-03 12:09:21

+1

@ user74158這不是設計模式或任何東西。它只是實現你想要做的事情的一種標準手段。這個想法是通過將依賴對象傳遞給'__init__'來建立顯式依賴關係。 – SuperSaiyan 2015-03-03 12:10:58

相關問題