Conceptos básicos de OOP
10 ejemplos para empezar con Python orientado a objetos: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con Python orientado a objetos: 7 básicos y 3 intermedios.
__init__Inicializa el estado de la instancia en el constructor.
class Greeter:
def __init__(self, prefix: str) -> None:
self.prefix = prefix
def greet(self, name: str) -> str:
return f"{self.prefix}, {name}!"
g = Greeter("Hello")
print(g.greet("Ada"))__init__ configura nuevas instancias; no es un constructor verdadero en el sentido de C++.self es la convención para la referencia de la instancia.Relacionado: Métodos Dunder / Mágicos - métodos especiales
Los atributos de clase se comparten; los atributos de instancia son por objeto.
class Counter:
total = 0
def __init__(self) -> None:
Counter.total += 1
self.value = 0Counter.total afecta a todas las instancias a menos que se sombreé en la instancia.__init__ son independientes por objeto.list, dict) como trampas de estado compartido.Relacionado: Métodos de clase vs. de instancia vs. estáticos -
@classmethod
Reutiliza el comportamiento mediante la subclasificación.
class Animal:
def speak(self) -> str:
return "..."
class Dog(Animal):
def speak(self) -> str:
return "woof"super() llama a la implementación del padre; es crucial en cadenas de __init__.Relacionado: Herencia y MRO - herencia múltiple
dataclass para registrosReduce el código repetitivo para clases que contienen datos.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(3, 4)
print(p.x, p.y)__init__, __repr__ y comparaciones cuando se configura.frozen=True para objetos de valor inmutables.field(default_factory=list) para valores predeterminados mutables.Relacionado: Dataclasses -
fieldypost_init
Expone atributos con getters/setters sin cambiar los puntos de llamada.
class Account:
def __init__(self, balance: float) -> None:
self._balance = balance
@property
def balance(self) -> float:
return self._balance_) indica internamente por convención; no es privacidad forzada.@property puede añadir validación en el setter más adelante.Relacionado: Propiedades y Descriptores - descriptores
__repr__ para depuraciónRepresentación legible del objeto en logs y REPL.
class User:
def __init__(self, user_id: int, name: str) -> None:
self.user_id = user_id
self.name = name
def __repr__(self) -> str:
return f"User({self.user_id!r}, {self.name!r})"__repr__ debe ser idealmente inequívoco y fácil de reconstruir.__str__ es para visualización humana; print usa __str__ y recurre a __repr__ si no está.dataclasses generan automáticamente un __repr__ útil.Relacionado: Métodos Dunder / Mágicos -
reprvsstr
Reemplaza cadenas mágicas con enumeraciones tipadas.
from enum import StrEnum
class Role(StrEnum):
ADMIN = "admin"
DEV = "dev"
def authorize(role: Role) -> bool:
return role == Role.ADMINStrEnum se comparan limpiamente con cadenas en contextos JSON.match exhaustivo sobre miembros de enum detecta casos faltantes.Relacionado: Enums -
IntEnumy flags
Delega el comportamiento a objetos auxiliares.
class EmailSender:
def send(self, to: str, body: str) -> None:
print(f"to={to} body={body}")
class Notifier:
def __init__(self, sender: EmailSender) -> None:
self._sender = sender
def notify(self, user_email: str, message: str) -> None:
self._sender.send(user_email, message)Notifier tiene un EmailSender en lugar de extenderlo.Relacionado: Mejores prácticas de Python Orientado a Objetos - reglas de diseño
abcImpone métodos que las subclases deben implementar.
from abc import ABC, abstractmethod
class Repository(ABC):
@abstractmethod
def get(self, item_id: int) -> dict: ...
class InMemoryRepo(Repository):
def get(self, item_id: int) -> dict:
return {"id": item_id}Protocol ofrece una alternativa estructural; consulta la sección de type hints.Relacionado: Clases Base Abstractas -
collections.abc
__slots__ para memoriaRestringe atributos y reduce la sobrecarga del diccionario por instancia.
class Coord:
__slots__ = ("x", "y")
def __init__(self, x: int, y: int) -> None:
self.x = x
self.y = yRelacionado: Inmutabilidad y Hashabilidad - puntos hasheables
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026