On 12/13/2010 11:47 PM, Steven D'Aprano wrote:
Karim wrote:

Hello all,

I am seeking for information about the template pattern applied to python. Could you explain some implementation or anything else? it would be helpful.

Design patterns are means to an end, not an end in themselves. You shouldn't say "I want to use the template pattern", you should say "I want to solve this problem, what solution is appropriate?" and then only use the template pattern if it is appropriate.


Steven, thank you for answering ;o)

I don't want to use this pattern absolutely. But I discussed this topic with a C++ programmer. He wanted to translate part of C++ code in python that implements this pattern in C++. I already have implemented a Strategy pattern in python to read different file format into
my database and generate different output format file like the code below:

class Input(object):
    """The basic Input class, leaving out the details of the algorithm."""
    def __init__( self, strategy ):
        self.strategy = strategy
        self.lastRead = None

    def read(self, filePath):
    """Load into database memory an input file.
    @arg: filePath - string - The input file path.
    @return: The created database object.
    """
    self.lastRead = self.strategy.read()
    return self.lastRead


class InputStrategy( object ):
    """This InputStrategy class is an abstract interface to various
    read strategy objects.
    """
    def read(self, filePath):
        """Abstract method to load into database memory an input file.
        @arg: filePath - string - The input file path.
        @return: The created database object.
        """
        raise NotImplementedError

By the way, I use NotImplementedError in my abstract method of the abstract class. You are using TypeError exception.
Is there a general rule for that? NotImplementedError is ok?

I knew from Java experience that template method pattern is only a kind of particular case of Stategy where you delegate parts of algorithm by abstract methods overriding. Indeed the base class implements some common features and let
derived classes implement particular parts by polymorphism.
Now with your example, I don't understand why he had problems to implement from C++ ?
Or perhaps is he mixing it with C++ feature template <class T> ?!

In any case, the template design pattern is one of the simpler design patterns. Here's an example, adapted from Wikipedia's article on the Template Method Pattern:


class AbstractGame:
    """An abstract class that is common to several games in which
    players play against the others, but only one is playing at a
    given time.
    """
    def __init__(self, *args, **kwargs):
        if self.__class__ is AbstractGame:
            raise TypeError('abstract class cannot be instantiated')

    def playOneGame(self, playersCount):
        self.playersCount = playersCount
        self.initializeGame()
        j = 0
        while not self.endOfGame():
            self.makePlay(j)
            j = (j + 1) % self.playersCount
        self.printWinner()

    def initializeGame(self):
        raise TypeError('abstract method must be overridden')

    def endOfGame(self):
        raise TypeError('abstract method must be overridden')

    def makePlay(self, player_num):
        raise TypeError('abstract method must be overridden')

    def printWinner(self):
        raise TypeError('abstract method must be overridden')


Now to create concrete (non-abstract) games, you subclass AbstractGame and override the abstract methods.

class Chess(AbstractGame):
    def initializeGame(self):
        # Put the pieces on the board.
        ...

    def makePlay(player):
        # Process a turn for the player
        ...

etc.


One more Thanks for you example Steven!
Regards
Karim
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to