在子类构造函数中不重复传递参数给父类构造函数

34
class P(object):
    def __init__(self, a, b):
       self.a = a
       self.b = b
class C(P):
    def __init__(self, c):
       P.__init__()
       self.c = c

obj = C(a, b, c) #want to instantiate a C with something like this
我想在不重写C类构造函数中P类的所有构造函数参数的情况下定义C类对象,但上面的代码似乎无法正常工作。有什么正确的方法可以做到这一点吗? 澄清: 这个想法是避免将父类构造函数的参数放入子类构造函数中。这只是重复太多了。我的所有父类和子类都有许多构造函数要接受参数,因此再次重复它们并不是很有效率且难以维护。我试图看看是否可以仅在子类的构造函数中定义其独特的属性,但仍然初始化继承的属性。

你想初始化父类的属性吗?如果不需要,你可以避免调用它的构造函数。 - AlokThakur
我确实想要初始化父类的属性。我认为另一种方法是使用父类的实例和子类的独特参数构建子类。 - Fenwick
2个回答

41
在Python2中,您需要编写:
class C(P):
    def __init__(self, a, b, c):
        super(C, self).__init__(a, b)
        self.c = c

在使用super函数时,第一个参数应为子类,第二个参数是你想要将其作为父类实例引用的对象实例。

在Python 3中,super函数具有超级能力,您可以编写:

class C(P):
    def __init__(self, a, b, c):
        super().__init__(a, b)
        self.c = c

示例:

obj = C(1, 2, 3) 
print(obj.a, obj.b, obj.c) # 1 2 3

回复您的评论:

您可以使用*args或**kwargs语法来实现这种效果,例如:

class C(P):
    def __init__(self, c, *args):
        super(C, self).__init__(*args)
        self.c = c

obj = C(3, 1, 2)
print(obj.a, obj.b, obj.c) # 1 2 3
或者
class C(P):
    def __init__(self, c, **kwargs):
        super(C, self).__init__(**kwargs)
        self.c = c

obj = C(3, a=1, b=2)
print(obj.a, obj.b, obj.c) # 1 2 3

obj = C(a=1, b=2, c=3)
print(obj.a, obj.b, obj.c) # 1 2 3

感谢您的回答 - 我添加了澄清部分以更好地解释我的问题。 - Fenwick
1
@Fenwick 但是如果你的问题是如何用a和b初始化C,但在调用初始化程序时从未以任何形式提供a和b的值,那么答案是你无法这样做。 - timgeb
哦,我肯定是指像你更新的答案那样的东西。不为a和b提供任何值根本没有意义。非常感谢! - Fenwick

2

通过传递self和所需参数,您可以调用父类构造函数

class C(P):
    def __init__(self, a,b,c):
       P.__init__(self,a,b)
       self.c = c

谢谢,我明白你的意思。我只是在寻找更好的解决方案/语法。请见澄清部分。 - Fenwick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接