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.