2016-06-30 24 views
0

我試圖圍繞類繼承包頭,但我無法弄清楚如何以直觀的方式從Parent類到Child類獲取值self。理想情況下,我想使用** kwargs,因爲我可能需要將其他關鍵字變量添加到Parent類。任意數量** kwargs的類繼承?

class police_officer(object): 
    def __init__(self, name=None, age='40'): 
     self.name = name 
     self.age = age 

class police_chief(police_officer): 
    def __init__(self): 
     pass # What should put I here to inherit the __init__() values? 


new_officer = police_officer(name='Danny') 
chief = police_chief(new_officer) 

print(chief.name) 

是我的顯式調用每個變量的唯一選擇時,我實例化首席? (舉例):

chief = police_chief(name=new_officer.name, age=new_officer.age) 
+1

'police_chief(new_officer)' - 不,不,不。你不會創建超類對象,然後在其周圍建立一個子類對象。 – user2357112

+0

我不確定如何使一個新的對象從父類繼承,但保持原始對象的相同的自我價值。有什麼辦法嗎? – Phil

+0

您根本不會製作「原始對象」。 – user2357112

回答

3

在這種情況下,你可以完全離開關在police_chief__init__

class police_chief(police_officer): 
    """A police officer who is chief.""" 

在警察局長有額外的設置在__init__做一個更一般的情況下,你可能會使用super

class police_chief(police_officer): 
    def __init__(self, is_boss=True, **kwargs): 
     super(police_chief, self).__init__(**kwargs) 
     self.is_boss = is_boss 

要具有超強的小心一點。 There are some pitfalls.。但是,如果你按照well established idioms,你會沒事的。你也可以通過做police_officer.__init__(self, **kwargs)來繞過它。

真的這個問題不是super(本身),這是多繼承問題。對於單一繼承,在使用它和直接調用超類方法之間沒有超級差別,沒有真正的差異。


正如你所提到的,那麼您需要實例化一個警察局長的方法是通過將police_officer參數警察局長構造:

chief = police_chief(name=new_officer.name, age=new_officer.age) 

如果你希望能夠到宣傳警察的首席,你需要有一個替代構造:

class police_chief(police_officer): 
    @classmethod 
    def promote(cls, officer, **kwargs): # create_from_officer is probably a better name ... 
     return cls(
      name=officer.name, 
      age=officer.age, 
      **kwargs) 

或者也許重構到代碼不使用inherita完全不用(而是使用某種形式的組合)。

+1

或者Python3中的'super()'。來吧,人們,它已經是CURRENTYEAR了! – o11c

+0

這似乎是我的問題的一個重要組成部分是,我不能到處傳遞類,比如我以爲我可以: new_officer = police_officer(NAME =「丹尼」) 首席= police_chief(new_officer) 我如何可以複製自身屬性在向高官推薦一名官員時有沒有像名字? – Phil

+0

@菲爾 - 你明確地做。查看我最近的修改。 – mgilson