Clases abstractas con ABC
Cómo usar `ABC` y `@abstractmethod` para definir contratos explícitos en jerarquías, incluyendo propiedades, classmethods y la diferencia práctica con Protocol.
Cómo usar `ABC` y `@abstractmethod` para definir contratos explícitos en jerarquías, incluyendo propiedades, classmethods y la diferencia práctica con Protocol.
Cómo estructurar objetos con composición en vez de herencia usando el patrón Strategy y Protocols en Python.
Diferencias entre convención `_`, name mangling con `__` y dunders; por qué `__` no es privacidad sino protección contra colisiones en herencia.
Cómo usar `@property`, `.setter` y `.deleter` para interceptar acceso a atributos con validación y cómputo sin romper la interfaz pública.
Cómo Python resuelve el diamond problem con C3 linearization y cómo los Mixins permiten combinar comportamiento de forma predecible y mantenible.
Cómo Python calcula el MRO con el algoritmo C3 y por qué `super()` llama al siguiente en la cadena, no al padre directo.
Cómo una subclase hereda atributos y métodos, cuándo usar super(), la diferencia entre extender y reemplazar, y cuándo preferir composición sobre herencia.
Diferencias prácticas entre los tres tipos de métodos en Python: cuándo cada uno recibe self, cls o ninguno, y por qué importa al heredar.
`self` es el primer parámetro de los métodos de instancia; Python transforma `obj.metodo(arg)` en `Clase.metodo(obj, arg)` automáticamente, haciendo visible lo que otros lenguajes ocultan.
Diferencia entre atributos de clase e instancia, cómo funciona el lookup en Python y el peligro oculto de los mutables compartidos.