tutorial subclases sobrecarga poo herencia crear constructores __init__ python oop inheritance constructor

subclases - sobrecarga de constructores python



Cadena de constructores padres constructores en python (3)

Esta pregunta ya tiene una respuesta aquí:

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"