Curso de Python / Agrupar estado y comportamiento con clases e instancias
Una clase define una forma de reunir datos y operaciones, y una instancia es un objeto concreto creado a partir de esa clase. En Python, esta organización resulta útil cuando varios valores representan una misma entidad y deben respetar reglas comunes, como el nombre y el importe de un gasto.
Qué representan la clase y sus objetos
Una función que suma números puede seguir siendo una función. Una clase empieza a aportar valor cuando necesita conservar estado entre operaciones o cuando los datos tienen un comportamiento propio. En este ejemplo, Expense representa un gasto y cada objeto conserva su nombre e importe.
La variable que recibe una instancia contiene una referencia al objeto. Crear dos instancias produce dos conjuntos de atributos independientes; asignar una referencia a otra variable, en cambio, no copia el objeto. La diferencia se relaciona con los alias y los objetos mutables.
Crear y ejecutar una clase completa
Guarda el siguiente programa como classes.py y ejecútalo con python classes.py desde su carpeta. Utiliza únicamente Python y no necesita paquetes externos. Los importes del ejercicio están expresados en wones coreanos, identificados por KRW.
class Expense:
def __init__(self, name, amount):
if amount < 0:
raise ValueError("negative amount")
self.name = name
self.amount = amount
def describe(self):
return f"{self.name}: {self.amount:,} KRW"
first = Expense("lunch", 8000)
second = Expense("bus", 2500)
print(first.describe())
print(second.describe())
print(first.amount + second.amount)
La salida muestra los dos gastos y después su suma:
lunch: 8,000 KRW
bus: 2,500 KRW
10500
Al llamar a Expense("lunch", 8000), Python crea el objeto y llama a __init__ para inicializarlo. Este método no debe devolver el objeto creado. Las asignaciones self.name y self.amount guardan atributos en esa instancia concreta.
Cómo recibe el objeto un método
self es el nombre convencional del primer parámetro de un método de instancia. En first.describe(), Python proporciona first como ese argumento automáticamente. La llamada equivalente para observar este mecanismo es Expense.describe(first); no debes pasar first dos veces en la llamada habitual.
| Referencia | Objeto | Importe inicial |
|---|---|---|
| first | Gasto de comida | 8000 |
| second | Gasto de transporte | 2500 |
Un método puede leer o modificar el estado del objeto al que está vinculado. Los atributos de instancia y de clase tienen reglas distintas de búsqueda y almacenamiento, por lo que conviene decidir de quién es cada dato antes de colocarlo en la definición.
Qué garantiza esta validación
El inicializador rechaza un importe negativo al construir el gasto. No establece todavía un contrato completo de tipos: comparar una cadena con cero produce otro error, y un booleano o un decimal requieren una decisión explícita. Tampoco controla una asignación posterior como first.amount = -1. Para mantener una regla en las actualizaciones puedes utilizar métodos y propiedades.
Prueba a cambiar first.amount a 9000 y comprueba que second.amount sigue siendo 2500. Después intenta construir un gasto de importe negativo y observa ValueError; retira esa llamada para restaurar la ejecución normal. Consulta la documentación de objetos de clase para completar el modelo. Mantén la impresión, el almacenamiento y las peticiones de red separados si no pertenecen a la responsabilidad del gasto.




