Una forma más sofisticada de compartir datos entre módulos sería a través de instancias de clase o patrones de diseño Singleton.
- Clases e instancias:
Si los datos que desea compartir están relacionados, puede incluirlos en una clase. Las clases son una forma de agrupar datos y funcionalidad.
Aquí hay un ejemplo simple:
# file: shared_data.py
class SharedData:
def __init__(self):
self.data = None
Luego en otro módulo:
# file: module1.py
from shared_data import SharedData
# create an instance of SharedData
shared_data_instance = SharedData()
shared_data_instance.data = "Hello, World!"
Y en un tercer módulo:
# file: module2.py
from shared_data import SharedData
# create another instance of SharedData
shared_data_instance = SharedData()
print(shared_data_instance.data) # This will print: None
Esto no funcionará como se esperaba, porque cada vez que crea una nueva instancia de SharedData
, tiene su propio data
atributo.
- Patrón único:
El patrón singleton es un patrón de diseño que restringe la instanciación de una clase a una sola instancia. Esto es útil cuando se necesita exactamente un objeto para coordinar acciones en todo el sistema. Aquí hay un ejemplo básico de una clase singleton:
# file: singleton.py
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
Ahora, cuando instancias la Singleton
clase varias veces, siempre obtienes la misma instancia:
# file: module1.py
from singleton import Singleton
singleton_instance = Singleton()
singleton_instance.data = "Hello, World!"
Y en un tercer módulo:
# file: module2.py
from singleton import Singleton
singleton_instance = Singleton()
print(singleton_instance.data) # This will print: "Hello, World!"
Esto funciona como se esperaba, porque la Singleton
clase siempre devuelve la misma instancia.
Sin embargo, tenga en cuenta que las variables globales y los singletons generalmente se consideran un mal diseño porque hacen que su programa sea más difícil de entender y pueden generar errores sutiles. Por lo general, es mejor pasar datos explícitamente a las funciones y métodos que los necesitan, aunque podría requerir más tipeo.