Clases y Objetos

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.

Anatomía de una clase

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.


Creando objetos

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.

Utilizando Propiedades y Métodos

Ya tenemos una clase Persona y un objeto pepe de tipo Persona. ¿Cómo interactuamos con el objeto?

  • Propiedades: Es posible acceder al valor de un atributo del objeto utilizando la referencia al objeto (pepe) y el nombre del atributo.
1pepe.nombre  # "Pepe"
2pepe.edad    # 30
  • Métodos: De la misma manera en la que se accede a los atributos pero agregando un paréntesis dentro del cual se pasan los argumentos si es que recibe alguno.
 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.


Self vs This

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: En Python, los atributos y métodos se acceden dentro de la clase anteponiendo 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 Java o C#, se utiliza 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"

Conclusión

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.