I'm working on a Python application in which there are two Singleton classes: App and Configuration.
The former seems straight forward, only ever instantiate one App instance; the latter seems controversial.
From the searches I've done, I need Configuration to be accessible from other modules that update the application's configuration file (and subsequently update the application). To do this, I've designed my class as a Singleton by controlling instantiation through its metaclasses __call__ method. To access the instance, in any module I do the following:
from app.config import Configuration
class Foo:
def __init__(self, *args, **kwargs):
self.config = Configuration()
Now, Foo is some feature beloning to App, I could've just as easily done:
from app import App
class Foo:
def __init__(self, *args, **kwargs):
self.config = App().configuration
Where App() returns the application Singleton and .configuration was an attribute where the Configuration was first instantiated. Further searching shows I could even use the app.config module as a Singleton, since Python only loads modules once. So regardless of defining a class as a Singleton or treating the module as a Singleton, the Singleton Pattern remains.
So what's wrong with either of these:
- Using the class Singleton
- Treating the module as a Singleton
In any case, I need a single configuration for the entire application. Creating multiple instances would lead to potential race conditions, so this seems like a smart way to handle it. Further, it seems extensible for features such as logging, right?