for. La sintaxis es más ligera que la de Java, y la filosofía, más flexible: lo que importa es lo que un objeto sabe hacer, no de qué clase es.
Lo que vas a aprender
- Cómo se define una clase con
__init__yself. - La diferencia entre atributos de instancia y de clase.
- Las propiedades con
@property. - La herencia y
super(). - El polimorfismo y el duck typing.
- Los métodos especiales y las
dataclass.
Fundamentos
Una clase
__init__es el constructor (inicializador).selfes el objeto actual. Es explícito: aparece como primer parámetro de cada método.
Encapsulación por convención
Python no tieneprivate. Se usa la convención de un guion bajo (_saldo) para “no tocar desde fuera”, y dos (__saldo) para que el nombre se cambie internamente y sea difícil acceder por accidente.
Propiedades
Permiten usar un método como si fuera un atributo, con control:Atributos de clase
Herencia
class C(A, B)); el orden en que se buscan los métodos lo da C.__mro__.
Polimorfismo y duck typing
“Si camina como un pato y grazna como un pato, es un pato.” No hace falta que los objetos compartan una clase base: basta con que tengan el método que se usa.abc.ABC y @abstractmethod.
Métodos especiales
Hacen que los objetos funcionen con la sintaxis del lenguaje:dataclasses
Para clases que sobre todo guardan datos,@dataclass genera __init__, __repr__ y __eq__ automáticamente:
Métodos de clase y estáticos
@classmethodrecibe la clase (cls) en lugar del objeto. Se usa para constructores alternativos:Fecha.desde_texto("2026-10-12").@staticmethodno recibe ni objeto ni clase: es una función normal agrupada dentro de la clase.
Ejemplos resueltos
Ejemplo 1 · Una pila como clase
Ejemplo 1 · Una pila como clase
Ejemplo 2 · Ordenar objetos
Ejemplo 2 · Ordenar objetos
order=True, la dataclass compara por los campos en orden: primero la nota.Ejemplo 3 · Herencia y sobrescritura
Ejemplo 3 · Herencia y sobrescritura
Errores frecuentes
- Olvidar
selfcomo primer parámetro de un método o al usar un atributo (saldoen lugar deself.saldo). - Usar una lista como atributo de clase pensando que es de cada objeto: la comparten todos.
- Olvidar llamar a
super().__init__()en la subclase: los atributos del padre no se crean. - Sobrescribir
__eq__y no__hash__si los objetos se van a usar en conjuntos o como claves de diccionario. - Crear getters y setters para todo, al estilo Java. En Python se usan atributos públicos y se pasa a
@propertysolo si hace falta control.
Preguntas frecuentes
¿Cuándo uso una clase y cuándo basta con funciones y diccionarios?
¿Cuándo uso una clase y cuándo basta con funciones y diccionarios?
Cuando los datos y las operaciones van siempre juntos, cuando hay varios objetos del mismo tipo con su propio estado, o cuando quieres que el tipo funcione con
+, for o print. Para guiones cortos o transformaciones de datos, las funciones suelen bastar.¿Qué diferencia hay entre str y repr?
¿Qué diferencia hay entre str y repr?
__str__ es para el usuario (print): legible. __repr__ es para el programador (la consola, la depuración): preciso y, si se puede, que sirva para recrear el objeto. Si solo se define __repr__, print también lo usa.Temas relacionados
Fundamentos de Python
Lo básico del lenguaje.
POO en Java
Clases, herencia e interfaces en Java.
Estructuras de datos
Pilas y colas como clases.