0

我寫了一大段很大程度上依賴於繼承和組合的代碼。現在我遇到了一個問題,即我的層次結構類需要共享變量以在彼此之間共享,但這會導致合成類也被共享,這意味着這些類的單獨實例將共享不想要的值他們去。我顯然吮吸用詞語解釋,所以我寫了一些代碼。沒有實例共享變量的複合和層次結構

class First(object): 
    def __init__(self): 
     self.subvar1 = 0 
     self.subvar2 = 10 

class Second(object): 
    variable3 = First() 

class Third(Second): 
    def __init__(self): 
     self.variable4 = self.variable3.subvar2 

Firstinstance = Third() 
Secondinstance = Third() 

Firstinstance.variable3.subvar1 = 50 
Secondinstance.variable3.subvar2 = 0 

print Firstinstance.variable3.subvar2 #<-prints 0 but i want 10 
print Secondinstance.variable3.subvar1 #<-prints 50 but i want 0 

除傾銷等級體系和寫一個大規模的集體,我可以防止合成後的類從具有自己的價值共享,有沒有爲我解決這個任何其他方式?

回答

0

問題來自Second.variable3是一個類屬性 - 也就是說,由類的所有實例共享,它是子類。你想:

class Second(object): 
    def __init__(self): 
     self.variable3 = First() 


class Third(Second): 
    def __init__(self): 
     super(Third, self).__init__() 
     self.variable4 = self.variable3.subvar2 

它會產生所需的結果。

+0

謝謝!解決了我的問題。有什麼缺點我應該知道嗎? (我什至不明白這是什麼) – Cestarian

+0

@Cestarian:如果你不明白這個代碼,你真的應該去做一些關於Python的類和OO模型的教程。 –

+0

我只是不明白它的超級部分。 我在尋找類的教程,他們的問題是,我發現的都不適合初學者。 – Cestarian

0

的方法之一是增加

self.variable3 = First() 

Third__init__,這樣你就可以保持FirstSecond不變,並防止共享這些值。