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.