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.