[Biopython] extending Motif class

Philip Machanick philip.machanick at gmail.com
Thu Mar 31 23:49:33 UTC 2011


I want to add a new scoring function to the Motif class and in true
object-oriented spirit would like to do it by deriving a new class rather
than hacking the existing code.

The general structure of my test program (all in 1 file) is:

from Bio.Motif import Motif

class ScannableMotif(Motif):
    def pwm_score_hit(self,sequence,position):
    ## stuff to compute my new score

from Bio import Motif
def main ():
    for motif in
ScannableMotif.parse(open("/Users/philip/tmp/meme.txt"),"MEME"):
        for i in range(3):
          print
motif.pwm_score_hit("CCTGGGGTCCCATTTCTCTTTTCTCTCCTGGGGTCCC",i)

The two different imports appear to be necessary. I need the first to be
able to use the base class to derive a new one, and without the second when
I use metaclass methods, I get

TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)

The other problem: I can't directly invoke a metaclass method on a derived
instance as above. The snippet below works as expected, but looks like a
kludge to me. Is there a better way of accessing metaclass methods from a
derived class object?

    for motif in Motif.parse(open("/Users/philip/tmp/meme.txt"),"MEME"):
        motif.__class__ = ScannableMotif # promote to the new class
        for i in range(3):
          print
motif.pwm_score_hit("CCTGGGGTCCCATTTCTCTTTTCTCTCCTGGGGTCCC",i)

I think I have the class vs. metaclass concept straight but understanding
why I need the two different flavours of import would be useful.
-- 
Philip Machanick
Rhodes University, Grahamstown 6140, South Africa
http://opinion-nation.blogspot.com/
+61-7-3871-0963 mobile +61 42 234 6909 skype philipmach



More information about the Biopython mailing list