Saltar al contenido principal
En Python todo es un objeto: los números, las cadenas, las listas y hasta las funciones. Definir clases propias permite crear tipos que se comportan como los del lenguaje: que se puedan imprimir, comparar, sumar o recorrer con 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__ y self.
  • 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).
  • self es el objeto actual. Es explícito: aparece como primer parámetro de cada método.

Encapsulación por convención

Python no tiene private. 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

Python admite herencia múltiple (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.
Si se quiere forzar una interfaz, 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

  • @classmethod recibe la clase (cls) en lugar del objeto. Se usa para constructores alternativos: Fecha.desde_texto("2026-10-12").
  • @staticmethod no recibe ni objeto ni clase: es una función normal agrupada dentro de la clase.

Ejemplos resueltos

Ejemplo 1 · Una pila como clase

Compárala con la animación de estructuras de datos.
Con order=True, la dataclass compara por los campos en orden: primero la nota.

Errores frecuentes

  • Olvidar self como primer parámetro de un método o al usar un atributo (saldo en lugar de self.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 @property solo si hace falta control.

Preguntas frecuentes

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.
__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.
Última modificación el 12 de octubre de 2026