6.2.4 Métodos
Métodos de instancia
Un método de instancia es un método que modifica el comportamiento del objeto al que hace referencia. Recibe self como primer parámetro, el cual se convierte en el propio objeto sobre el que estamos trabajando. Python envía este argumento de forma transparente.
Veamos un ejemplo en el que, además del constructor, creamos un método de instancia para desplazar un droide:
Métodos de clase
Un método de clase es un método que modifica el comportamiento de la clase a la que hace referencia. Recibe cls como primer parámetro, el cual se convierte en la propia clase sobre la que estamos trabajando. Python envía este argumento de forma transparente. La identificación de estos métodos se completa aplicando el decorador @classmethod a la función.
Veamos un ejemplo en el que implementaremos un método de clase que lleva la cuenta de los droides que hemos creado:
Métodos estáticos
Un método estático es un método que no modifica el comportamiento del objeto ni de la clase. No recibe ningún parámetro especial. La identificación de estos métodos se completa aplicando el decorador @staticmethod a la función.
Veamos un ejemplo en el que creamos un método estático para devolver las categorías de droides que existen en StarWars:
Métodos mágicos
Nivel avanzado
Cuando escribimos ‘helio world’ * 3 ¿cómo sabe el objeto ‘helio world’ lo que debe hacer para multiplicarse con el objeto entero 3? O dicho de otra forma, ¿cuál es la implementación del operador * para «strings» y enteros? En valores numéricos puede parecer evidente (siguiendo los operadores matemáticos), pero no es así para otros objetos. La solución que proporciona Python para estas (y otras) situaciones son los métodos mágicos.
Los métodos mágicos empiezan y terminan por doble subguión______ (es por ello que también se les conoce como «dunder-methods»). Uno de los «dunder-methods» más famosos es el constructor de una clase:_______________________ init____ ().
Figura 11: Equivalencia entre operador y método mágico
Veamos un ejemplo en el que «sumamos» dos droides. Esto se podría ver como una fusión. Supongamos que la suma de dos droides implica: a) que el nombre del droide resultante es la concatenación de los nombres de los droides; b) que la energía del droide resultante es la suma de la energía de los droides:
Figura 12: Métodos mágicos para comparaciones y operaciones matemáticas
__str__
Uno de los métodos mágicos más utilizados es __str__ que permite establecer la forma en la que un objeto es representado como cadena de texto:
Ejercicio
Defina una clase Fraction que represente una fracción con numerador y denominador enteros y utilice los métodos mágicos para poder sumar, restar, multiplicar y dividir estas fracciones.
Además de esto, necesitaremos:
- gcd(a, b) como método estático siguiendo el algoritmo de Euclides para calcular el máximo común divisor entre a y b.
- __ init___ (self, num, den) para construir una fracción (incluyendo simplificación de sus términos mediante el método gcd().
- __ str____ (self) para representar una fracción.
Compruebe que se cumplen las siguientes igualdades:
Gestores de contexto
Otra de las aplicaciones de los métodos mágicos (especiales) que puede ser interesante es la de gestores de contexto. Se trata de un bloque de código en Python que engloba una serie de acciones a la entrada y a la salida del mismo.
Hay dos métodos que son utilizados para implementar los gestores de contexto:
_ enter____ () Acciones que se llevan a cabo al entrar al contexto.
_ exit___ () Acciones que se llevan a cabo al salir del contexto.
Veamos un ejemplo en el que implementamos un gestor de contexto que mide tiempos de ejecución:
Ahora podemos probar nuestro gestor de contexto con un ejemplo concreto. La forma de «activar» el contexto es usar la sentencia with seguida del símbolo que lo gestiona: