具有任意数量的** kwargs的类继承?

时间:2016-06-30 22:52:08

标签: python inheritance init self kwargs

我正试图围绕类继承,但我无法弄清楚如何以直观的方式从Parent类获取 self 值到Child类。理想情况下,我想使用** kwargs,因为我可能需要在Parent类中添加其他关键字变量。

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 个答案:

答案 0 :(得分:4)

在这种情况下,您可以完全取消__init__中的police_chief

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

对超级 1 要小心。 There are some pitfalls.。但是,如果你关注well established idioms,你就会好起来的。您也可以通过执行police_officer.__init__(self, **kwargs)来绕过它。

1 真的问题不在于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)

或者可能重构代码以完全不使用继承(而是使用某种形式的组合)。