Considere esto: una clase base A, clase B heredando de A, clase C heredando de B. ¿Cuál es una forma genérica de llamar a un constructor clase padre en un constructor? Si esto todavía suena demasiado vago, aquí hay un código.Constructores padre de llamada en cadena en python
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
super(B,self).__init__()
print "Constructor B was called"
class C(B):
def __init__(self):
super(C,self).__init__()
print "Constructor C was called"
c = C()
Así es como lo hago ahora. Pero aún parece un poco demasiado genérico: todavía debe pasar un tipo correcto a mano.
Ahora, he intentado usar self.__class__
como primer argumento para super(), pero, obviamente, no funciona, si lo pones en el constructor para C, es suficiente, se llama al constructor de B. Si haces lo mismo en B, "self" aún apunta a una instancia de C, por lo que terminas llamando al constructor de B otra vez (esto termina en una recursión infinita).
No hay necesidad de pensar en la herencia de diamantes por ahora, solo me interesa resolver este problema específico.
"Pero todavía parece un poco demasiado no genérico - que todavía debe pasar un tipo correcto a mano. "?? Estás pasando el nombre de la clase a super(). Nunca necesita saber la superclase ni nada más. ¿Cómo es esto no genérico? ¿Qué problema crea? ¿Puedes dar un ejemplo de dónde se rompe esto? –
No estoy listo para responder esta pregunta si está completo. Pero de todos modos, ¿y si la clase cambia de nombre? ¿Qué pasa si quiero escribir una función de decorador para automatizar este tipo de encadenamiento? Ahora veo, que esto no es posible, pero a la hora de hacer la pregunta no sabía eso. – shylent