我正试图围绕类继承,但我无法弄清楚如何以直观的方式从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)
答案 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)
或者可能重构代码以完全不使用继承(而是使用某种形式的组合)。