2017-03-12 28 views
-1

是否有可能在子類中創建一個新的屬性,它將具有與父屬性相同的名稱和值(主屬性的副本)? 此屬性將由所有子子類繼承。Python:複製父屬性,給它同名

我的問題是,我只允許更改Lanc類(不允許對其他類進行更正),並且只有class superLanc應該繼承該屬性。查看class superLanc,return self.brand應返回子類Lanc的新屬性。

class Machine(object):  
    def __init__(self, brand):   
     self.brand = brand  
    def start(self, attr):   
     return self.brand + attr  
    def __str__(self):   
     return self.brand 

class Mitsh(Machine):  
    def mEng(self, attr):   
     return Machine.start(self, attr) 

class Lanc(Mitsh): 
    def start(self, attr): 
     return self.brand + Mitsh.mEng(self, attr) 

class superLanc(Lanc): 
    def start(self, attr): 
     return self.brand + Mitsh.mEng(self, attr) 
    def mEng(self, attr): 
     return Mitsh.mEng(self, attr) 
+0

你當然可以重載'Lanc .__ init__'並將'self.brand'設置爲你想要的。我從你的例子不明白你真正想要達到什麼。你能說明你想如何使用這些類嗎? – BrenBarn

+0

這是一個練習,它沒有真正的目的。 我只想要在類Lanc中定義一個新的self.brand,它將與父self.brand具有相同的值,並附加一些附加值。 通過superLanc調用它時,它將返回這些新值,而對Mitsh.mEng(self,attr)的調用仍將提供Machine(父級)的self.brand值。 – Nenson

+0

我不認爲你可以做到這一點。任何使用'self'的實例的任何超類中的任何代碼都會引用同一個對象,所以無論哪個類訪問它,'self.brand'都會具有相同的結果。 (順便說一句,這與你的問題看起來有很大的不同,你的問題並沒有說什麼就是想讓'self.brand'根據哪個類調用它而給出不同的結果。) – BrenBarn

回答

0

我真的不明白你的問題。一個類是一個類的定義(屬性)和它的行爲(方法)。子類繼承父類的定義並「改進」它。

但屬性的值不會被繼承,它們只是被稱爲實例的類的狀態。

對於我來說,你說的是一個孩子類可以繼承父類的值,這是不正確的(除了類屬性)。所以,在我看來,如果你想(我真的不想你想要的),一個子類的實例「知道」父類的實例,可能你應該傳遞一個對「父類「實例到」子「實例。

您也可以在子類中使用某種組合(請參閱:https://en.wikipedia.org/wiki/Composition_over_inheritance),或者您可以將此引用傳遞給需要它的任何方法。

對不起。我不確定我可以幫你。

+0

我被允許僅更改類Lanc,以便Lanc.start和superLanc.start都打印修改的self.brand屬性。例如「你好:」+ self.brand – Nenson