Encapsulación en Python: `_`, `__` y name mangling
Diferencias entre convención `_`, name mangling con `__` y dunders; por qué `__` no es privacidad sino protección contra colisiones en herencia.
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.
Cómo Python crea e inicializa objetos con `__new__` e `__init__`, y por qué los métodos viven en la clase mientras los atributos viven en la instancia.
Implementa context managers propios con `__enter__` y `__exit__` para garantizar limpieza de recursos con semántica equivalente a `try/finally`.