Module (47%)
Section (50%)

Cómo construir una jerarquía de clases

Construir una jerarquía de clases no es solo por amor al arte.

Si divides un problema entre las clases y decides cuál de ellas debe ubicarse en la parte superior y cuál debe ubicarse en la parte inferior de la jerarquía, debes analizar cuidadosamente el problema, pero antes de mostrarte cómo hacerlo (y cómo no hacerlo), queremos resaltar un efecto interesante. No es nada extraordinario (es solo una consecuencia de las reglas generales presentadas anteriormente), pero recordarlo puede ser clave para comprender cómo funcionan algunos códigos y cómo se puede usar este efecto para construir un conjunto flexible de clases.

Echa un vistazo al código en el editor. Analicémoslo:

  • Existen dos clases llamadas Uno y Dos, se entiende que Dos es derivada de Uno. Nada especial. Sin embargo, algo es notable: el método doit().
  • El método doit() está definido dos veces: originalmente dentro de Uno y posteriormente dentro de Dos. La esencia del ejemplo radica en el hecho de que es invocado solo una vez - dentro de Uno.

La pregunta es: ¿cuál de los dos métodos será invocado por las dos últimas líneas del código?


La primera invocación parece ser simple, el invocar el método haz_algo() del objeto uno obviamente activará el primero de los métodos.

La segunda invocación necesita algo de atención. También es simple si tienes en cuenta cómo Python encuentra los componentes de la clase. La segunda invocación lanzará el método hazlo() en la forma existente dentro de la clase Dos, independientemente del hecho de que la invocación se lleva a cabo dentro de la clase Uno.

En efecto, el código genera el siguiente resultado:

hazlo de Uno hazlo de Dos

Nota: la situación en la cual la subclase puede modificar el comportamiento de su superclase (como en el ejemplo) se llama polimorfismo. La palabra proviene del griego (polys: "muchos, mucho" y morphe, "forma, forma"), lo que significa que una misma clase puede tomar varias formas dependiendo de las redefiniciones realizadas por cualquiera de sus subclases.

El método, redefinido en cualquiera de las superclases, que cambia el comportamiento de la superclase, se llama virtual.

En otras palabras, ninguna clase se da por hecho. El comportamiento de cada clase puede ser modificado en cualquier momento por cualquiera de sus subclases.

Te mostraremos cómo usar el polimorfismo para extender la flexibilidad de la clase.



Code

class Uno:
def hazlo(self):
print("hazlo de Uno")

def haz_algo(self):
self.hazlo()

class Dos(Uno):
def hazlo(self):
print("hazlo de Dos")

uno = Uno()
dos = Dos()

uno.haz_algo()
dos.haz_algo()
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×