Singleton Pattern in Python
Make sure a class has exactly one shared instance, such as one settings object or one connection pool.
- The problem Singleton solves
- Implementing it with __new__
- Simpler Python alternatives: modules
- 1
a = AppConfig()First call creates the instance - 2
b = AppConfig()Second call returns the stored one - 3
a is b → TrueSame object
Every call returns the same object
Singleton es un patrón de diseño (design pattern) que garantiza que una clase solo tenga un objeto en todo el programa, y que todo el código acceda a ese mismo objeto. Encaja con elementos que deben gestionarse de forma centralizada, como la configuración de la aplicación o la conexión a la base de datos.
Puntos clave
- The class keeps its one instance in a class attribute.
- __new__ creates it the first time and returns it every time after.
- Use it sparingly: global shared state makes testing harder.
- In Python a module-level object often does the same job.
¿Cuándo se usa?
- Resolver problemas recurrentes de diseño de objetos con estructuras probadas.
- Desacoplar responsabilidades para facilitar la extensión y las pruebas del código.
- Usar un vocabulario de diseño común al hablar de arquitectura con el equipo.
Código de ejemplo
class AppConfig:
# Singleton: every caller receives one shared configuration object.
_instance = None
def __new__(cls):
# Create the shared instance only on the first call.
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.theme = "dark"
return cls._instance
first = AppConfig()
second = AppConfig()
print(first is second)
Resultado de la ejecución
True
Explicación del código
El método __new__ se llama antes que __init__ cada vez que se crea un objeto. En la primera llamada, _instance todavía vale None, así que se crea el objeto y se guarda. En las llamadas siguientes, __new__ simplemente devuelve el objeto guardado, por eso al comparar los dos objetos con is se obtiene True.
Cambia los valores y ejecuta el programa en el compilador Python online de CodeUtility sin instalar Python.
Ejercicios de práctica
Prueba a modificar el código siguiendo las ideas de abajo. Cambiar el código y ver el resultado te ayudará a entender la lección mucho mejor que solo leerla.
- Sustituye el dominio del ejemplo conservando la estructura del patrón.
- Compara el patrón con una implementación más sencilla y explica las ventajas y desventajas.
- Escribe pruebas para cada participante antes de añadir otra implementación.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
Todos los retos