Pasar argumentos al constructor de superclase sin repetirlos en el constructor de clase de niño

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 

Quiero definir el objeto de la clase C sin volver a escribir todo el argumento del constructor de la clase P constructor de C , pero el código anterior no parece funcionar. ¿Cuál es el enfoque correcto para hacer esto?

Aclaración:

La idea es evitar poner los argumentos del constructor de la clase padre en el constructor de la clase hijo. Solo está repitiendo demasiado. Todas mis clases para padres e hijos tienen muchos argumentos para los constructores, por lo que repetirlos una y otra vez no es muy productivo y es difícil de mantener. Estoy tratando de ver si solo puedo definir lo que es único para la clase hija en su constructor, pero todavía puedo inicializar atributos heredados.

En Python2, escribes

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

donde el primer argumento de super es la clase secundaria y el segundo argumento es la instancia del objeto al que desea tener una referencia como instancia de su clase primaria.

En Python 3, super tiene superpoderes y puedes escribir

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

Manifestación:

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

Respuesta a tu comentario:

Podría lograr ese efecto con la syntax * args o ** kwargs, por ejemplo:

 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 

o

 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 

Puede llamar al constructor de la clase padre pasando argumentos propios y obligatorios

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