[Tutor] The Template Pattern
Karim
karim.liateni at free.fr
Sat Dec 18 07:41:22 CET 2010
Hello Steven,
Could take some time when possible to answer to my follow-up question?
Thank you!
Cheers
Karim
On 12/14/2010 12:19 AM, Karim wrote:
> 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 at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
More information about the Tutor
mailing list