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.
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.
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.
Descripción de conceptos:
classDeclara una clase.ClienteAsigna un nombre a la clase, siempre en PascalCase y sin guiones bajos.password = '1234'Declara una variable de clase.defDeclara un método.__init__Lleva dos guiones al principio y al final del nombre, se le conoce como método dunder, especial o mágico.selfEs el primer atributo obligatorio siempre.dni,nombre,apellidoSe llaman atributos del método y van separados por una,coma.self.dniDeclara una variable de instancia.dniGuarda el valor de la variable de instancia.cuentaAsigna un nombre al método.self.passwordHace referencia a la variable de instancia para retornar su valor.cli_1Crea un objeto.ClienteInvoca a la clase desde cualquier parte de la aplicación.'88521596P','Luis','Mendoza'Se llaman argumentos.PrintEs una función para imprimir en pantalla.cli_1.cuentahace referencia al objetocli_1para acceder a la clase y ejecutar el métodocuenta.- 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.


