Continuamos con el curso de Programación Avanzada, y en esta ocasión nos toca ver algunos aspectos más avanzados en relación a la Programación Orientada a Objetos (POO). Concretamente, vamos a conocer conceptos como la Herencia y la Sobrecarga de Operadores.

Sobrecarga de Operadores

Dentro de la POO existe un concepto conocido como Sobrecarga de Operaciones. Esto nos permite definir de que manera se comportará un determinado operador en relación a una clase en cuestión. Por poner un ejemplo, podríamos tener una clase Agenda() donde el operador + sirviera para añadir una nueva persona a la agenda en si.

Operadores matemáticos de suma, división, multiplicación e igual.

Cada lenguaje de programación tiene su propia manera de implementar esta funcionalidad. En Python, disponemos de una serie de métodos especiales (los cuales empiezan y terminan con doble subrayado) que se encargan de definir cada operador.

Métodos Especiales en Python

  • __contains__(self, item):
    Se usa para determinar la pertenencia de item al objeto. Se puede invocar con el operador in.
  • __len__(self):
    Proporciona la longitud del objeto (en el caso de una secuencia, por ejemplo, el número de elementos que la forman). Se invoca con la función len().
  • __getitem__(self, key):
    Acceso al objeto con indexación para consulta. Se invoca con el operador de indexación.
  • __setitem__(self, key, value):
    Acceso al objeto con indexación para asignación. Se invoca con el operador de indexación sobre un objeto que aparece en la parte izquierda de una asignación.
  • __iter__(self):
    Iterador que recorre los elementos de la estructura.
  • _getattr__(self, id):
    Acceso al atributo id de un objeto para su consulta. Se invoca con el operador de indexación.
  • __setattr__(self, id, value):
    Acceso al atributo id de un objeto para asignación de un valor. Se invoca con el operador de indexación sobre un objeto que aparece en la parte izquierda de la asignación.
  • __call__(self, *args):
    Llamada al objeto. Permite usar el objeto como si se tratara de una función.
  • __str__(self):
    Representación
    del objeto como una cadena (la que devuelve el método). El método se invoca automáticamente cuando se muestra por pantalla el objeto o cuando se «convierte» el objeto a cadena con la función str().
  • __repr__(self):
    Representación
    del objeto como cadena. Se diferencia del método anterior en que __str__ debe proporcionar una descripción legible por humanos, mientras que __repr__ debe proporcionar una descripción que el intérprete de Python pueda analizar.
  • __add__(self, other):
    Operador de suma (+). Cuando esta definido para un objeto a, el método se invoca en una expresión como a + b, y b sería el objeto accesible con other.
  • __sub__(self, other):
    Operador de resta (-).
  • __mul__(self, other):
    Operador de multiplicación (*).
  • __div__(self, other):
    Operador de división (/).
  • __mod__(self, other):
    Operador de módulo de la división (%).
  • __gt__(self, other):
    Operador de comparación «mayor que» (>).
  • __lt__(self, other):
    Operador de comparación «menor que» (<).
  • __ge__(self, other):
    Operador de comparación «mayor o igual que» (>=).
  • __le__(self, other):
    Operador de comparación «menor o igual que» (<=).
  • __eq__(self, other):
    Operador de comparación «igual» (==).
  • __ne__(self, other):
    Operador de comparación «no igual» (!=)
  • __lshift__(self, other):
    Operador de desplazamiento bit a bit a izquierdas (<<).
  • __rshift__(self, other):
    Operador de desplazamiento bit a bit a derechas (>>).

Herencia y Polimorfismo

Uno de los conceptos fundamentales de la POO es la Herencia, debido a que nos permite crear diversas jerarquías entre los objetos. Gracias a ello, es posible crear una clase base la cual se encarga de definir las características en común de una serie de objetos relacionados entre si. Por ejemplo, podríamos tener una clase Animal() con los aspectos básicos de la misma, y luego diversas clases derivadas como Perro() o Gato().

Por otra parte, el polimorfismo es el término que se utiliza para describir el proceso por el cual diversas implementaciones de una misma función se pueden utilizar bajo un mismo nombre, garantizando con ello un acceso uniforme a la funcionalidad.

Herencia en Python

Como hemos comentado, es posible definir una clase a partir de otra, heredando sus atributos y métodos. Para ello, basta con acompañar al identificador de la clase con el de la clase (o clases) padre encerrado entre paréntesis.

class Contacto(Persona):
	telefono = "123456789"

Retomando el ejemplo de la agenda de la entrada anterior, podemos definir que todos los contactos de nuestra agenda serán personas y además también tendrán un teléfono. Atención a como toda persona tiene un nombre y una edad, pero no necesariamente ha de tener un teléfono, de ahí la creación de la nueva clase heredada, que mejora la funcionalidad de la principal.

Además, la nueva clase puede redefinir los métodos del padre, de ser necesario. Durante dicho proceso, todavía es posible acceder al método de la clase padre mediante el uso de la función super().

class Contacto(Persona):
	def __init__(self, nombre, edad, telefono):
		super(Contacto, self).__init__(nombre, edad)
		self.telefono = telefono

Para finalizar, podemos determinar si un objeto es instancia de una clase, ya sea de forma directa o mediante herencia, gracias a la función isinstance().


Con esta entrada damos por finalizada la sección correspondiente a presentar la Programación Orientada a Objetos. Todavía quedarían algunas funcionalidades por desengranar, pero debido al alcance del presente curso opino que no llegarán a ser necesarias para nuestros propósitos.

¡Nos leemos!

Programación Avanzada

  1. Programación Orientada a Objetos
  2. POO – Aspectos Avanzados
  3. Gestión de Interrupciones
  4. Coste Computacional
  5. Estructuras Avanzadas: Colas
  6. Estructuras Avanzadas: Diccionarios
  1. Estructuras Avanzadas: Grafos
  2. Estructuras Avanzadas: Árboles
  3. Exploración de Grafos
  4. Expresiones Regulares
  5. Patrones de Diseño
  6. Proyecto Final: Intérprete

Ejercicios Resueltos


¿Quieres estar al día de todo lo publicado en el blog?

Para ello puedes suscribirte a mi canal RSS y/o seguirme en mis Redes Sociales.

Etiquetas: , , ,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad