Entrada

POO : Polimorfismo

En artículos anteriores mencionaba de una forma breve el concepto de polimorfismo. Aquí vamos a ver no solo código sino que también su representación en los diagramas de clases. El polimorfismo es una técnica que nos posibilita que al invocar un determinado método de un objeto, pueden obtenerse distintos resultados según su clase. En otras palabras podemos crear distintos objetos de diferentes clases y que todas compartan un método con el mismo nombre, pero que realice acciones diferentes.

Un ejemplo de esto en un diagrama de clases podría ser la siguiente: profesor, padre, estudiante son personas:

---
title: "Ejemplo de polimorfismo"
---
classDiagram
    class `Clase Persona fa:fa-person`{
      +nombre
      +apellido
      +respirar()
    }
    class `Clase Profesor fa:fa-chalkboard-user`{
      +presentarse()
    }
    class `Clase Estudiante fa:fa-user-graduate` {
      +presentarse()
    }
    class `Clase Padre fa:fa-user-tie`{
      +presentarse()
    }
    `Clase Persona fa:fa-person` <|-- `Clase Profesor fa:fa-chalkboard-user` : hereda
    `Clase Persona fa:fa-person` <|-- `Clase Estudiante fa:fa-user-graduate` : hereda
    `Clase Persona fa:fa-person` <|-- `Clase Padre fa:fa-user-tie` : hereda

En este ejemplo, las tres clases (Profesor, Padre, Estudiante) podrán utilizar el método respirar, ya que lo heredan de la clase persona, pero podemos ver que tanto la clase Profesor, la clase Estudiante y la clase Padre tienen el método presentarse().

Si queremos llevar el ejemplo a código, tendríamos que comenzar definiendo la clase Persona y luego el resto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Persona:

    def __init__(self, nombre, apellido):
        self.nombre = nombre
        self.apellido = apellido

    def respirar(self):
      print("respirando")

class Profesor(Persona):
  def presentarse():
    pass

class Estudiante(Persona):
  def presentarse():
    pass

class Padre(Persona):
  def presentarse():
    pass

Hasta aquí podemos ver como efectivamente las clases (Profesor, Estudiante, Padre) son subclases de Persona:

  • 1
    2
    3
    
    print(Profesor.__bases__)
    print(Estudiante.__bases__)
    print(Padre.__bases__)
    
  • 1
    2
    3
    
    (<class '__main__.Persona'>,)
    (<class '__main__.Persona'>,)
    (<class '__main__.Persona'>,)
    

Y de forma análoga podemos ver que clases descienden de una en concreto:

  • 1
    
    print(Persona.__subclasses__())
    
  • 1
    
    [<class '__main__.Profesor'>, <class '__main__.Estudiante'>, <class '__main__.Padre'>]
    

Mi lema es

Esta entrada está licenciada bajo CC BY 4.0 por el autor.