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
类构造函数参数,但上面的代码似乎没有工作。这样做的正确方法是什么?
澄清:
这个想法是避免将父类的构造函数参数放在子类的构造函数中。它只是重复了太多。我的所有父类和子类都有许多参数可供构造函数使用,因此一次又一次地重复它们并不是很有效且难以维护。我试图看看我是否只能在其构造函数中定义子类的唯一内容,但仍然初始化继承的属性。
答案 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