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.

A simple MVC framework

will describe in the following post a (very) simple MVC framework. You can download the source code from here or can make a copy from bitbucket repository.

As you can see, we have the following folders:
– web: here resides your public files (images, css, and index.php)
– app: here you can find application files: models, views, controllers (MVC)

How it works?
URL:
a) http://www.mydomain.com/testfolder/web/index.php
b) http://www.mydomain.com/testfolder/web/index.php/index/index/name/razvan…

All the requests goes to index.php from web folder. So you can set up your webserver and .htaccess for this.

The first request is to index.php from web folder.

  • Here we include all necesary files (of course we can use autoload, but this is a proof of concept example).
  • Call for an instance of FrontController class
  • Call the route method of FrontController class
  • Display the result (body).

FrontController class (located in front.php file) implements the singleton pattern.

I will explain a little the constructor method and the route method. The other ones are obvious.

The constructor tries to match the controller name, the action name, and the parameters from the request URL.

In the class you can specify a start folder (START_FOLDER). In our example should be: START_FOLDER = ‘/testfolder/web/’
If no controller, and/or no action are specified in the request URL it assume is “index” (case a).

In route method we are using Reflection class to determine if indeed the class for the found controller exists

if(class_exists($this->getController()))

and is has the specified action

if($rc->hasMethod($this->getAction()))

Also, the controller must implement the interface IController:

if($rc->implementsInterface('IController'))

If all these conditions are valid, we can call the method

$method->invoke($controller);

 

In the next step, we are going to index controller class (file index.php from controllers). Here we have the “index” action.

– From the FrontController class we call getParams() method.
– Create a new View object
– Assign parameters to $view object properties
– Call render method of the $view object
– set content with setBody() front controller method.

The View class needs also some explications.

We overloaded the __set method so we can to assign parameters to $view object properties without they exists before.

We also wrote a __get method to return an empty string if you can to access a nonexistent property of a view object.
The render method, simply include the specified file using output buffering.

In the view file (index.php from views folder) you can access previously assigned properties with $this->propertyname.

This MVC framework is mainly based on the example from the book “Pro PHP Patterns, Frameworks, Testing and More” by Kevin McArthur.

 

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.