小编典典

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

python

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的所有类构造函数参数,但是以上代码似乎不起作用。什么是正确的方法来做到这一点?

澄清:

这样做的目的是避免将父类的构造函数参数放在子类的构造函数中。只是重复太多了。我所有的父类和子类都有许多构造函数要接受的参数,因此一次又一次地重复它们并不是很有效,并且很难维护。我试图查看是否只能在其构造函数中为子类定义唯一的东西,但仍初始化继承的属性。


阅读 251

收藏
2021-01-20

共1个答案

小编典典

在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
2021-01-20