不必在Python中重新定义类继承中的属性

时间:2015-06-11 18:47:26

标签: python class inheritance

我有这样的事情:

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。肯定是另一种方式,但我不知道如何。

有什么想法吗?

1 个答案:

答案 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并不能真正解释预期的内容。那太糟糕了。

  • 如果参数的数量很少,原始问题应该不是问题。如果数字太大,也许初始化参数本身需要形成一个类。