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 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í podemos ver para qué se utiliza la palabra clave pass en Python.

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

Agregaremos 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 instanciemos una clase, se ejecutará el método __init__(). Con esta función estaremos inicializando el objeto que estemos creando.

A continuación crearemos una clase, la instanciaremos 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 crearemos el objeto factura_uno instanciando la clase Facturas y podremos 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.

Crearemos 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. Al instanciarla mediante el módulo __init_(), crearemos los dos objetos.

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 Nochevieja', 3.15)
factura_dos = Facturas('hijklmn5678', '1/1/2023', 'Comida', 35.50)

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

# Uvas Nochevieja
# 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__(). Para ello 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 Nochevieja')
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 Nochevieja’.

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 Nochevieja')
print(factura_uno)

# El motivo es Uvas Nochevieja 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 Nochevieja')
print(factura_uno)

# El motivo es 'Uvas Nochevieja' con fecha '12/12/12'

Podemos ver cómo nos indica entre comillas simples que ‘Uvas Nochevieja’ 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 Nochevieja')
print(factura_uno)

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

Se puede apreciar claramente que nos está indicando que ‘Uvas Nochevieja’ 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 *