En programación orientada a objetos, las clases y objetos son los conceptos centrales para entender cómo modelamos elementos de la realidad y definimos su estructura y comportamiento dentro del software. Veamos en detalle la anatomía de una clase, cómo crear objetos a partir de ella para usar sus propiedades y métodos, y otros detalles clave de su relación.
Una clase actúa como un plano o molde para construir objetos similares, definiendo sus características comunes y funcionalidades. Es similar al plano para construir casas de un mismo barrio: todas comparten ciertos atributos clave.
Los componentes típicos de una clase son:
Atributos (propiedades): Variables que caracterizan al objeto. Por ejemplo, para una clase Persona
, atributos como nombre
, edad
, DNI
, etc.
1class Persona:
2 dni = ""
3 nombre = ""
4 edad = 0
Métodos: Funciones que definen comportamientos. Por ejemplo, una Persona
puede caminar()
, hablar()
, comer()
, etc. Acceden a los atributos para implementar dicha funcionalidad.
Constructor: Método especial __init__()
que se ejecuta al instanciar la clase y permite inicializar los atributos.
Destructor: Método __del__()
que se ejecuta al eliminar la instancia liberando recursos. Opcional en algunos lenguajes.
A partir de la clase generamos objetos, que son instancias concretas con sus propios atributos definidos. Digamos que la clase Casa es el plano, y una casa específica en una calle determinada es el objeto.
En código creamos un objeto invocando la clase como si fuera un método:
1# Clase Persona
2class Persona:
3 def __init__(self, n, e):
4 self.nombre = n
5 self.edad = e
6
7# Objeto Persona específico
8pepe = Persona("Pepe", 30)
9juan = Persona("Juan", 35)
Cada objeto comparte la estructura y comportamiento general, pero puede almacenar distintos datos.
Ya tenemos una clase Persona
y un objeto pepe
de tipo Persona
. ¿Cómo interactuamos con el objeto?
pepe
) y el nombre del atributo.1pepe.nombre # "Pepe"
2pepe.edad # 30
1# Clase Persona
2class Persona:
3 def __init__(self, n, e):
4 self.nombre = n
5 self.edad = e
6
7 def comer(self, comida):
8 print(f"Comiendo {comida}")
9
10# Objeto Persona específico
11pepe = Persona("Pepe", 30)
12pepe.comer("pizza") # Imprime "Comiendo pizza"
El objeto pepe tiene ahora estado (propiedades) y comportamiento (métodos) propios.
Un detalle importante en los métodos es cómo acceden a los atributos y otros métodos del objeto. Aquí entra otra diferencia entre lenguajes:
self
. Esto apunta al objeto instanciado. 1class Persona:
2
3 def __init__(self, nombre):
4 self.nombre = nombre
5
6 def saludar(self):
7 print(f"Hola! Soy {self.nombre}")
8
9juan = Persona("Juan")
10juan.saludar()
11# Imprime "Hola! Soy Juan"
this
en lugar de self. Cumple la misma funcionalidad de apuntar a los miembros del objeto. 1public class Person {
2
3 private String nombre;
4
5 public Person(String nombre) {
6 this.nombre= nombre;
7 }
8
9 public void saludar() {
10 System.out.println("Hola! Soy " + this.nombre);
11 }
12}
13
14Person juan = new Person("Juan");
15juan.saludar();
16// Imprime "Hola! Soy Juan"
Las clases y objetos son los conceptos clave de la POO, permitiendo modelar entidades de la realidad y generar componentes modulares y genéricos de nuestro sistema para construir programas más robustos y fáciles de entender y mantener.