Categories
python

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.

[code language=”python”]
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
[/code]

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

[code language=”python”]
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
[/code]

Let’s test this:

[code language=”python”]
db1 = Database().get_connection()
db2 = Database().get_connection()

print (db2)
print (db1)
[/code]

You will see something like:

[code language=”bash”]
<_mysql.connection open to ‘localhost’ at 16b4800>
<_mysql.connection open to ‘localhost’ at 16b4800>
[/code]

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:

[code language=”bash”]
<_mysql.connection open to ‘localhost’ at c91e20>
<_mysql.connection open to ‘localhost’ at bccba0>
[/code]

You can find the fully example here.

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