[Edu-sig] Gutless classes

Dethe Elza delza at livingcode.org
Fri Sep 9 23:02:56 CEST 2005


On 9-Sep-05, at 10:54 AM, Kirby Urner wrote:

> Yeah, this is clever, I like it.  You slam the door from the inside,
> interpose a "door closed" next time run() is called -- likely in  
> error.

It's usful for things where a decision needs to be made *once* rather  
than testing a condition every time the code is run, so instead of:

class MyUsualThing(object):

     def doYourThing(self, x,y,z):
         if isThisAMac():
             # mac code here
         elif isThisWindows():
             # windows code here
         elif isThisLinux():
             # linux code here

you can do:

class MyTrampolinedThing(object):

     def _doMacThing(self, x,y,z):
         # mac code here

     def _doWindowThing(self, x,y,z):
         # windows code here

     def _doLinuxThing(self, x,y,z):
         # linux code here

     def doYourThing(self, x,y,z):
         klas = self.__class__
         if isThisAMac():
             klas.doYourThing = klas._doMacThing
         elif isThisWindows():
             klas.doYourThing = klas._doWindowsThing
         elif isThisLinux():
             klas.doYourThing = klas._doLinuxThing
         del klas._doMacThing
         del klas._doWindowsThing
         del klas._doLinuxThing
         return self.doYourThing(x,y,z)

You could of course define your specific handlers inline in the  
doYourThing method before it is replaced, but I think it's clearer to  
define them seperately and then delete them to clean up the object  
namespace.  As you can see, this could be confusing if you get a  
stacktrace which lists doYourThing, because this method will only  
ever be called once, and after that the doYourThing will be one of  
the other methods.  Still, it avoids a test on subsequent calls and  
possibly a function call or two.

Just remember that premature optimization is the root of all evil.   
If trampolining make the code flow *more* readable, use it.  Or, if  
your code is too slow, and you've profiled it and found that the  
tests are the culprit, then use it.  Otherwise, it can make your  
objects into a jumbled, untraceable mess.

--Dethe

"All spiritual paths have four steps: show up, pay attention, tell the
truth, and don't be attached to the results."  Angeles Arien


-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2488 bytes
Desc: not available
Url : http://mail.python.org/pipermail/edu-sig/attachments/20050909/9abd948e/smime.bin


More information about the Edu-sig mailing list