Uma maneira mais sofisticada de compartilhar dados entre os módulos seria por meio de instâncias de classe ou padrões de projeto Singleton.
- Classes e Instâncias:
Se os dados que você deseja compartilhar estiverem relacionados, você pode envolvê-los em uma classe. As classes são uma maneira de agrupar dados e funcionalidades.
Aqui está um exemplo simples:
# file: shared_data.py
class SharedData:
def __init__(self):
self.data = None
Em outro 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!"
E em um terceiro 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
Isso não funcionará como esperado, porque cada vez que você cria uma nova instância de SharedData
, ela possui seu próprio data
atributo.
- Padrão Singleton:
O padrão singleton é um padrão de design que restringe a instanciação de uma classe a uma única instância. Isso é útil quando exatamente um objeto é necessário para coordenar ações no sistema. Aqui está um exemplo básico de uma classe 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
Agora, quando você instancia a Singleton
classe várias vezes, sempre obtém a mesma instância:
# file: module1.py
from singleton import Singleton
singleton_instance = Singleton()
singleton_instance.data = "Hello, World!"
E em um terceiro módulo:
# file: module2.py
from singleton import Singleton
singleton_instance = Singleton()
print(singleton_instance.data) # This will print: "Hello, World!"
Isso funciona como esperado, porque a Singleton
classe sempre retorna a mesma instância.
No entanto, esteja ciente de que variáveis globais e singletons geralmente são considerados um design ruim porque tornam seu programa mais difícil de entender e podem levar a erros sutis. Geralmente é melhor passar dados explicitamente para funções e métodos que precisam deles, mesmo que isso exija mais digitação.