subclases - sobrecarga de constructores python
Cadena de constructores padres constructores en python (3)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo invocar al super constructor? 5 respuestas
Considere esto: una clase base A, clase B heredada de A, clase C heredada de B. ¿Qué es una forma genérica de llamar a un constructor de clase principal en un constructor? Si esto todavía suena demasiado vago, aquí hay algo de código.
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 todavía parece un poco demasiado no genérico: aún debe pasar un tipo correcto a mano.
Ahora, he intentado usar self.__class__
como un primer argumento para super (), pero, obviamente, no funciona, si lo pones en el constructor para C: bastante, se llama al constructor de B. Si haces lo mismo en B, "self" todavía apunta a una instancia de C, por lo que terminas llamando al constructor de B nuevamente (esto termina en una recursión infinita).
No hay necesidad de pensar en la herencia del diamante por ahora, solo estoy interesado en resolver este problema específico.
La forma en que lo está haciendo es la recomendada (para Python 2.x).
La cuestión de si la clase se pasa explícitamente a super
es una cuestión de estilo en lugar de funcionalidad. Pasar la clase a super
ajusta a la filosofía de Python de "explícito es mejor que implícito".
Python 3 incluye un super () mejorado que permite un uso como este:
super().__init__(args)
Usted puede simplemente escribir:
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
A.__init__(self)
# A.__init__(self,<parameters>) if you want to call with parameters
print "Constructor B was called"
class C(B):
def __init__(self):
# A.__init__(self) # if you want to call most super class...
B.__init__(self)
print "Constructor C was called"