Python Singleton Classes

What is a Singleton Class in Python?

A singleton class is a design pattern in Python that restricts the instantiation of a class to a single object. In other words, it ensures that only one instance of the class exists throughout the program.

Why Use a Singleton Class?

There are several scenarios where using a singleton class can be beneficial:

  1. When you want to limit the number of instances of a class to just one.
  2. When you need a single point of access to a shared resource.
  3. When you want to control access to a resource, such as a database connection or a file.

Implementing a Singleton Class in Python

There are different ways to implement a singleton class in Python. Here, we will discuss two common approaches: using a decorator and using a metaclass.

Using a Decorator

Decorators are a way to modify the behavior of a function or a class without changing its source code. Here’s an example of implementing a singleton class using a decorator:

“`python
def singleton(cls):
instance = None

def wrapper(*args, **kwargs):
nonlocal instance
if instance is None:
instance = cls(*args, **kwargs)
return instance

return wrapper

@singleton
class MyClass:
def __init__(self, name):
self.name = name

def greet(self):
print(f”Hello, {self.name}!”)

# Creating instances
obj1 = MyClass(“John”)
obj2 = MyClass(“Jane”)

# Both instances refer to the same object
print(obj1 is obj2) # Output: True
“`

In the above example, the `singleton` decorator ensures that only one instance of the `MyClass` class is created. The first time the class is instantiated, the decorator creates the instance. Subsequent instantiations return the same instance.

Using a Metaclass

A metaclass is the class of a class. It allows you to define the behavior of a class, including how the class should be instantiated. Here’s an example of implementing a singleton class using a metaclass:

“`python
class Singleton(type):
instance = None

def __call__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__call__(*args, **kwargs)
return cls.instance

class MyClass(metaclass=Singleton):
def __init__(self, name):
self.name = name

def greet(self):
print(f”Hello, {self.name}!”)

# Creating instances
obj1 = MyClass(“John”)
obj2 = MyClass(“Jane”)

# Both instances refer to the same object
print(obj1 is obj2) # Output: True
“`

In the above example, the `Singleton` metaclass ensures that only one instance of the `MyClass` class is created. The first time the class is instantiated, the metaclass creates the instance. Subsequent instantiations return the same instance.

Conclusion

A singleton class in Python restricts the instantiation of a class to a single object. It can be useful in scenarios where you want to limit the number of instances, control access to a shared resource, or have a single point of access to a resource. You can implement a singleton class using a decorator or a metaclass, depending on your preference and requirements.

Scroll to Top