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的所有类构造函数参数,但是以上代码似乎不起作用。什么是正确的方法来做到这一点?
澄清:
这样做的目的是避免将父类的构造函数参数放在子类的构造函数中。只是重复太多了。我所有的父类和子类都有许多构造函数要接受的参数,因此一次又一次地重复它们并不是很有效,并且很难维护。我试图查看是否只能在其构造函数中为子类定义唯一的东西,但仍初始化继承的属性。
在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