2016-06-30 26 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