Example for singleton decorator pattern in python

I know there is not very common in Python to use the singleton pattern, but I found a nice implementation of this pattern in Python 3 Patterns, Recipes and Idioms book. Starting with that example I implemented an equivalent of the well known PHP getConnection example.

You have the code below:

This is the class that implements the Singleton pattern.

class Singleton:
  def __init__(self, klass):
    self.klass = klass
    self.instance = None
  def __call__(self, *args, **kwds):
    if self.instance == None:
      self.instance = self.klass(*args, **kwds)
    return self.instance

Now, we create a class and we decorate it with the Singleton class. Let’s import also MySQLdb module *.

import MySQLdb
 
@Singleton
class Database:
  connection = None
  def get_connection(self):
    if self.connection is None:
      self.connection = MySQLdb.connect(host="localhost", user="root", passwd="razvan", db="mydatabase")
    return self.connection

Let’s test this:

db1 = Database().get_connection()
db2 = Database().get_connection()
 
print (db2)
print (db1)

You will see something like:

<_mysql.connection open to 'localhost' at 16b4800>
<_mysql.connection open to 'localhost' at 16b4800>

As you can see there is only one object.

For fun, let’s remove the line “@Singleton” and re-run the example. This time you will see different objects:

<_mysql.connection open to 'localhost' at c91e20>
<_mysql.connection open to 'localhost' at bccba0>

You can find the fully example here.

* If you don’t know how to install MySQLdb, you can check the previous post.

Singleton Pattern

This pattern is probably one of the most simple and used pattern.

As php manual says: The Singleton pattern applies to situations in which there needs to be a single instance of a class. The most common example of this is a database connection. Implementing this pattern allows a programmer to make this single instance easily accessible by many other objects.

There are tons of information about this pattern over the Internet so I let you google for it.

You can find a singleton implementation in Simple MVC framework example.