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.