Saltar a contenido

1. Introducción al uso de clases

Python es un lenguaje orientado a objetos, no es necesario hacer uso de ellas para poder crear un programa. De hecho, hemos estado trabajando hasta ahora sin hacer mención a ellas ni emplearlas.

Hasta ahora, hemos construido aplicaciones pequeñas de manera secuenciada y desorganizada. Esto no significa que lo hayamos hecho mal, lo que quiero decir es, que cuando empecemos a crear aplicaciones diámicas y sean mas complejas, necesitaremos mejorar la estructura del código, la organización y crear código reutilizable y facilitar su mantenimiento.


1.1. Clase estática:

PRECAUCIÓN

Hay que evitar el mal uso de las clases, en este ejemplo, vemos que las variables no son reutilizables, tampoco podemos pasarle argumentos.


Image

Código Python 👇

class Cliente:

    dni = '88521596P'
    nombre = 'Luis'
    apellido = 'Mendoza'

    def __init__(self):
        print(f'DNI: {self.dni}\nNombre: {self.nombre}\nApellido: {self.apellido}')


Cliente()

# salida:
    # DNI: 88521596P
    # Nombre: Luis
    # Apellido: Mendoza
  • ❌ Estructurado.
  • ❌ Organizado.
  • ❌ Escalable.
  • ❌ Reutilizable.

1.2. Clase dinámica:

La manera recomendada de contruir aplicaciónes con código reutilizable y organizada, es con el uso de las clases. Al principio, es normal que te sientas perdido con todo esto de las clases, pero no te preocupes, todos hemos pasado por esta etapa.

Para crear una clase, vamos a emplear la palabra reservada class seguido de un nombre escrito en PascalCase, primera letra de cada palabra se escribe en mayúscula, y sin guiones bajos. Sabemos que las clases pueden contener funciones, a las que llamamos métodos. Una clase también puede contener variables, a las que se conoce con el nombre de atributos. Para crear atributos, primero definimos un método especial llamado __init__(), que es invocado por Python automáticamente siempre que se crea una instancia de la clase (conocido también como constructor o inicializador).

Los clientes que vayamos a crear, no tendrán el mismo dni, nombre ni apellido. Por ello sería conveniente permitir que, al definir una instancia, se pase como argumento el dni del cliente y éste se almacene en el atributo self.dni, nombre del cliente en el atributo self.nombre y apellido del cliente en el atributo self.apellido.


IMPORTANTE

Dentro de la clase, las variables pasan a llamarse atributos, el primer atributo obligatorio siempre sera self, las funciones pasan a llamarse métodos, nos permite pasarle argumentos y eso hace que el código sea reutilizable. Estas son las razones por el cual se crearon las clases en programación.


Image

Código Python 👇

class Cliente:
    def __init__(self, dni, nombre, apellido):
        self.dni = dni
        self.nombre = nombre
        self.apellido = apellido

        print(f'DNI: {self.dni}\nNombre: {self.nombre}\nApellido: {self.apellido}')

Cliente('88521596P', 'Luis', 'Mendoza')
Cliente('96452178K', 'Maribel', '')

# salida:
    # DNI: 88521596P
    # Nombre: Luis
    # Apellido: Mendoza
    # DNI: 96452178K
    # Nombre: Maribel
    # Apellido:

1.3. Crear objetos con clase:

TIP

Antes del auge de la POO, la programación estaba dominada por el paradigma procedimental. Este enfoque estructuraba los programas como una serie de instrucciones secuenciales y dependía en gran medida de funciones y datos globales. Si bien este modelo era efectivo para problemas simples, se volvió difícil de manejar a medida que los sistemas se hicieron más complejos debido a la falta de separación clara entre los datos y las operaciones.


Python es un lenguaje multiparadigma:

  • Soporta la programación imperativa y funcional.
  • Soporta la programación orientada a objetos (POO).

En este ejemplo, vamos a crear 2 objetos que se van a llamar cli_1 y cli_2. cli_1 va tener DNI, Nombre, Apellido y el cli_2 va tener solamente DNI, Nombre. La ventaja de poder crear estos objetos de una forma tan simplificada, es impresionante.


Código Python 👇

class Cliente:

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

cli_1 = Cliente('88521596P', 'Luis', 'Mendoza')
cli_2 = Cliente('96452178K', 'Maribel', '')

print(f'DNI: {cli_1.dni}\nNombre: {cli_1.nombre}\nApelllido: {cli_1.apellido}')
print(f'DNI: {cli_2.dni}\nNombre: {cli_2.nombre}')

# salida:
    # DNI: 88521596P
    # Nombre: Luis
    # Apellido: Mendoza
    # DNI: 96452178K
    # Nombre: Maribel
    # Apellido:

1.4. Métodos dentro de una clase:

En este ejemplo, vamos a crear un método normal llamado cuenta, el primer atributo obligatorio se llama self, seguido pondremos nuestros atributos opcionales separadas por una ,coma y cerramos la linea con : dos puntos.

Dentro del método, indentamos con 4 espacios para empezar a escribir nuestro código de ejecución. En este caso, vamos a emplear return para retornar un mensaje que ponga Cuenta: El cliente ????????? tiene cuenta. Con esto, ya tendriamos nuestra clase completado.

Utilizaremos los mismos objetos cli_1 y cli_2 creados en el ejercicio anterior. La forma de acceder a ello es, llamamos primero al objeto cli_1 y ponemos un . punto y llamamos al metodo cuenta. Al tratarse de un método, como toda función, devemos cerrarla con ()parentesis. El código quedaria de la siguiente manera cli_1.cuenta()

Finalizamos el ejemplo con la función print() para imprimir en pantalla lo que hemos programado en esta clase, print(cli_1.cuenta()) y print(cli_2.cuenta())


Código Python 👇

class Cliente:

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

    def cuenta(self):
        return f'Cuenta: El cliente {self.dni} tiene cuenta'

cli_1 = Cliente('88521596P', 'Luis', 'Mendoza')
cli_2 = Cliente('96452178K', 'Maribel', '')

print(cli_1.cuenta())
print(cli_2.cuenta())

# salida:
    # Cuenta: El cliente 88521596P tiene cuenta
    # Cuenta: El cliente 96452178K tiene cuenta

1.5. Estructura básica de una clase:

Llegados aqui, aprenderemos los conceptos básicos que construyen una clase. Trata de leer el código y entender lo que sucede en cada paso.

Image

Descripción de conceptos:

  1. class Declara una clase.
  2. Cliente Asigna un nombre a la clase, siempre en PascalCase y sin guiones bajos.
  3. password = '1234' Declara una variable de clase.
  4. def Declara un método.
  5. __init__ Lleva dos guiones al principio y al final del nombre, se le conoce como método dunder, especial o mágico.
  6. self Es el primer atributo obligatorio siempre.
  7. dni,nombre, apellido Se llaman atributos del método y van separados por una , coma.
  8. self.dni Declara una variable de instancia.
  9. dni Guarda el valor de la variable de instancia.
  10. cuenta Asigna un nombre al método.
  11. self.password Hace referencia a la variable de instancia para retornar su valor.
  12. cli_1 Crea un objeto.
  13. Cliente Invoca a la clase desde cualquier parte de la aplicación.
  14. '88521596P', 'Luis', 'Mendoza' Se llaman argumentos.
  15. Print Es una función para imprimir en pantalla.
  16. cli_1.cuenta hace referencia al objeto cli_1 para acceder a la clase y ejecutar el método cuenta.
  17. Visualizamos los datos en la pantalla.


Código Python 👇

class Cliente:
    password = '1234'

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

    def cuenta(self):
        return f'{self.nombre} {self.apellido}:\nUsuario: {self.dni}\nContraseña: {self.password}'

cli_1 = Cliente('88521596P', 'Luis', 'Mendoza')
cli_2 = Cliente('96452178K', 'Maribel', 'Garcia')

print(cli_1.cuenta())
print(cli_2.cuenta())

# salida:
    # Luis Mendoza:
    # Usuario: 88521596P
    # Contraseña: 1234
    # Maribel Garcia:
    # Usuario: 96452178K
    # Contraseña: 1234
  • ✅ Facil de estructurar.
  • ✅ Facil de organizar.
  • ✅ Facil de leer.
  • ✅ Facil de escalar.
  • ✅ Código reutilizable.

IMPORTANTE

Las variables de clase son útiles cuando queremos utilizar un mismo valor en cualquiera de los metodos. Son accesibles desde cualquier método. Dentro de las clases, no se recomienda el uso de las condicionales. Su uso está enfocado en gestionar datos y métodos.

💬 Es fundamental entender bien la estructura y la lógica de las clases para poder seguir avanzando y evitar estancamientos en el futuro.