Volver a Python Básico

Clases y Programación Orientada a Objetos

Python soporta programación orientada a objetos (POO) a través de clases.

Definir una Clase

class Animal: # Atributo de clase (compartido por todas las instancias) reino = "Animalia" def __init__(self, nombre, sonido): # Atributos de instancia self.nombre = nombre self.sonido = sonido def hablar(self): return f"{self.nombre} dice {self.sonido}!" perro = Animal("Rex", "Guau") gato = Animal("Bigotes", "Miau") print(perro.hablar()) # Rex dice Guau! print(Animal.reino) # Animalia

Herencia

class Perro(Animal): def __init__(self, nombre, raza): super().__init__(nombre, "Guau") self.raza = raza def buscar(self): return f"{self.nombre} trae la pelota!" # Sobreescribir método padre def hablar(self): return f"{self.nombre} ladra fuerte!" rex = Perro("Rex", "Labrador") print(rex.hablar()) # Rex ladra fuerte! print(rex.buscar()) # Rex trae la pelota! print(isinstance(rex, Animal)) # True

Métodos Especiales (Dunder)

class Vector: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return f"Vector({self.x}, {self.y})" def __repr__(self): return f"Vector(x={self.x}, y={self.y})" def __add__(self, otro): return Vector(self.x + otro.x, self.y + otro.y) def __eq__(self, otro): return self.x == otro.x and self.y == otro.y v1 = Vector(1, 2) v2 = Vector(3, 4) v3 = v1 + v2 print(v3) # Vector(4, 6)

Propiedades

class Temperatura: def __init__(self, celsius): self._celsius = celsius @property def celsius(self): return self._celsius @celsius.setter def celsius(self, valor): if valor < -273.15: raise ValueError("¡Temperatura por debajo del cero absoluto!") self._celsius = valor @property def fahrenheit(self): return self._celsius * 9/5 + 32 t = Temperatura(100) print(t.fahrenheit) # 212.0 t.celsius = 0 print(t.fahrenheit) # 32.0

Dataclasses (Python 3.7+)

from dataclasses import dataclass, field @dataclass class Producto: nombre: str precio: float etiquetas: list = field(default_factory=list) def aplicar_descuento(self, porcentaje): return self.precio * (1 - porcentaje / 100) p = Producto("Laptop", 999.99, ["electrónica", "computadoras"]) print(p) # Producto(nombre='Laptop', precio=999.99, ...) print(p.aplicar_descuento(10)) # 899.991

Principio POO: Prefiere la composición sobre la herencia al construir sistemas complejos.