我有这样的事情:
Class Parent(object):
def __init__(self, x=None):
self.x = x
Class Child(Parent):
def __init__(self, y):
super(Child, self).__init__()
self.y = y
test = Child(y=42)
这很好用:test.y等于42,test.x等于None。当我尝试定义x:
时出现问题 test = Child(x=32, y=42)
这显然不起作用; x参数不是预期的。我知道解决这个问题的方法是:
Class Child(Parent):
def __init__(self, x, y):
super(Child, self).__init__(x)
self.y = y
但是我需要在相当深的父子继承中为很多变量执行此操作,并且在我看来,在每个新__init__
中编写所有先前的参数并不看起来像pythonic。肯定是另一种方式,但我不知道如何。
有什么想法吗?
答案 0 :(得分:1)
执行此操作的一种方法是使用kwargs
:
class Parent(object):
def __init__(self, x=None):
print 'got', x
self.x = x
class Child(Parent):
def __init__(self, y, **kwargs):
super(Child, self).__init__(**kwargs)
self.y = y
孩子会自动将其转发给父母:
>> test = Child(y=42)
got None
>> test = Child(y=42, x=13)
got 13
这在技术上有效,但我不太喜欢它,但是:
子类的ctor的docstring并不能真正解释预期的内容。那太糟糕了。
如果参数的数量很少,原始问题应该不是问题。如果数字太大,也许初始化参数本身需要形成一个类。