Métodos con Python

Los métodos de una clase en Python son las acciones o comportamientos que van a tener los objetos que se creen mediante dicha clase.

Métodos Python

Básicamente son funciones que se definen dentro de una clase, funciones de Python creadas con una peculiaridad, todas deben tener como primer parámetro a self → uno mismo (no tiene que llamarse self a la fuerza, pero sí debe ser el primer parámetro de cualquier método dentro de la clase.).

En este ejemplo crearemos un método que retorne una cadena de texto que diga ‘Timbre sonando…’

class Timbres:
    pass

    def hago_rin(self):
        return 'Timbre sonando...'

print(type(Timbres.hago_rin))
# <class 'function'>

Mediante la impresión de type() podemos comprobar que hago_rin es una función.

Ahora vamos a crear un objeto llamado timbre_puerta instanciando nuestra clase Timbres, luego llamaremos al método hago_rin.

class Timbres:
    pass

    def hago_rin(self):
        return 'Timbre sonando...'

timbre_puerta = Timbres()
print(timbre_puerta.hago_rin())

# Timbre sonando...

Desde aquí puedes ver para qué se utiliza la palabra clave pass en Python.

Vamos a ver el ejemplo cambiando el nombre al parámetro self por otro_self (aunque no es conveniente hacerlo se puede cambiar sin problemas).

Agregaré la función __init__() a la clase para que cobre algo de sentido self y retornaremos desde el método hago_rin un f string de Python que incluya la posición desde la que se llama al método.

class Timbres:
    pass

    def __init__(otro_self, posicion):
        otro_self.posicion = posicion

    def hago_rin(otro_self):
        return f'Timbre sonando desde {otro_self.posicion}...'

timbre_puerta = Timbres('pasillo')
# Timbre sonando desde pasillo...

Método __init__() en Python

Cada vez que instanciamos una clase se ejecuta el método __init__(), con esta función estamos inicializando el objeto que estemos creando.

Vamos a crear una clase, instanciaremos la clase y desde el método __init__() le daremos algunos valores a nuestro nuevo objeto.

class Facturas:
    pass

    def __init__(self):
        self.identificador = 'abcdefg1234'
        self.fecha = '31/12/2022'
        self.motivo = 'Uvas noche vieja'
        self.precio = 3.15

Ahora creamos el objeto factura_uno instanciando la clase Facturas y podemos ver que se ha creado con las propiedades definidas en el método __init__().

factura_uno = Facturas()
print(factura_uno.identificador)

# abcdefg1234

Hacer esto no tiene mucho sentido si los datos que introducimos no son dinámicos, ya que siempre que creemos un objeto estaremos creándolo con las mismas propiedades.

Vamos a modificar nuestra clase Facturas e incluiremos en el método __init__() únicamente una propiedad dinámica. De esta forma cada vez que creemos un objeto esta propiedad será diferente.

Voy a crear dos objetos (factura_uno y factura_dos) para ver que el valor de la propiedad fecha varía para cada objeto.

from datetime import datetime
class Facturas:
    pass

    def __init__(self):
        self.fecha = datetime.now()

factura_uno = Facturas()
factura_dos = Facturas()

# 2022-11-16 16:23:00.639888
# 2022-11-16 16:23:00.639896

Ahora vamos a crear la clase Facturas, y crearemos dos objetos al instanciarla mediante el módulo __init__().

class Facturas:
    pass

    def __init__(self, identificador, fecha, motivo, precio):
        self.identificador = identificador
        self.fecha = fecha
        self.motivo = motivo
        self.precio = precio

factura_uno = Facturas('abcdefg1234', '31/12/2022', 'Uvas noche vieja', 3.15)
factura_dos = Facturas('hijklmn5678', '1/1/2023', 'Comida', 35.50)

print(factura_uno.motivo)
print(factura_dos.motivo)

# Uvas noche vieja
# Comida

Método __str__() en Python

Existe un método llamado __str__ que como su nombre indica hace referencia a las cadenas de texto. Este método (representación informal del objeto) controla lo que se tiene que devolver cuando llamamos a print() desde nuestro programa.

Puede sonar un poco raro pero lo vamos a ver con un ejemplo.

Vamos a crear una clase Facturas e inicializaremos el objeto con el método __init__(). Crearemos un objeto llamado factura_uno e imprimiremos en pantalla ese objeto.

class Facturas:
    pass 

    def __init__(self, fecha, motivo):
        self.fecha = fecha
        self.motivo = motivo

factura_uno = Facturas('12/12/12', 'Uvas noche vieja')
print(factura_uno)

# <__main__.Facturas object at 0x1024e3580>

Como podemos ver, imprimir nuestro objeto así tal cual nos ha devuelto que el objeto ha sido creado instanciando la clase Facturas y que se almacena en la posición de memoria 0x1024e3580. No ha mostrado ninguno de los valores que hemos introducido para crear nuestro objeto, ni fecha ’12/12/12′ ni motivo ‘Uvas noche vieja’.

Vamos a ver qué ocurre si nosotros definimos el método __str__() para Python en nuestra clase.

class Facturas:
    pass

    def __init__(self, fecha, motivo):
        self.fecha = fecha
        self.motivo = motivo

    def __str__(self):
        return f'El motivo es {self.motivo} con fecha {self.fecha}'

factura_uno = Facturas('12/12/12', 'Uvas noche vieja')
print(factura_uno)

# El motivo es Uvas noche vieja con fecha 12/12/12

Método __repr__() con Python

El método __repr__() nos devuelve la representación formal del objeto sin ambigüedades. Vamos a ver el mismo ejemplo de antes pero agregando este método.

class Facturas:
    pass

    def __init__(self, fecha, motivo):
        self.fecha = fecha
        self.motivo = motivo

    def __repr__(self):
        return f'El motivo es {self.motivo !r} con fecha {self.fecha !r}'

factura_uno = Facturas('12/12/12', 'Uvas noche vieja')
print(factura_uno)

# El motivo es 'Uvas noche vieja' con fecha '12/12/12'

Podemos ver cómo nos indica entre comillas simples que ‘Uvas noche vieja’ y fecha ’12/12/12′ son cadenas de texto, es el dato extra que aporta esta versión formal de la cadena.

Vamos a ver el mismo ejemplo pero esta vez cuando estemos creando nuestro objeto pasaremos una tupla como fecha.

class Facturas:
    pass

    def __init__(self, fecha, motivo):
        self.fecha = fecha
        self.motivo = motivo

    def __repr__(self):
        return f'El motivo es {self.motivo !r} con fecha {self.fecha !r}'

fecha_limite = ('Enero', 2022)
factura_uno = Facturas(fecha_limite, 'Uvas noche vieja')
print(factura_uno)

# El motivo es 'Uvas noche vieja' con fecha ('Enero', 2022)

Se puede apreciar claramente que nos está indicando que ‘Uvas noche vieja’ sigue siendo un string, pero la fecha nos la imprime con formato formal de tupla (‘Enero’, 2022).

Dejar un comentario

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