将参数传递给超类构造函数,而不在子类构造函数中重复它们

时间:2016-02-08 05:08:43

标签: python oop

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类构造函数参数,但上面的代码似乎没有工作。这样做的正确方法是什么?

澄清:

这个想法是避免将父类的构造函数参数放在子类的构造函数中。它只是重复了太多。我的所有父类和子类都有许多参数可供构造函数使用,因此一次又一次地重复它们并不是很有效且难以维护。我试图看看我是否只能在其构造函数中定义子类的唯一内容,但仍然初始化继承的属性。

2 个答案:

答案 0 :(得分:21)

在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

答案 1 :(得分:0)

您可以通过传递self和required参数来调用父类构造函数

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