Advanced Python Concepts Object Oriented Programming BCHB 524
Advanced Python Concepts: Object Oriented Programming BCHB 524 Lecture 17 BCHB 524 - Edwards
Using Classes l We've actually been using objects and their methods already! s = 'ACGTACGT' print s. count('T') print s. replace('T', 'U') l = [6, 5, 4, 3, 2, 1] l. append(10) l. sort() s = set() s. add(1) s. add(2) BCHB 524 - Edwards 2
Using Classes l We've actually been using objects and their methods already! import Bio. Seq. IO thefile = open("ls_orchid. fasta") for seq_record in Bio. Seq. IO. parse(thefile, "fasta"): print seq_record. id print seq_record. description print seq_record. seq thefile. close() BCHB 524 - Edwards 3
Using Classes l Classes make instances of objects l l l Objects can hold information l l l string is a class, 'ACGT' is an instance of a string. Make new instances using class name: l s = string(), d = dict(), s = set(), i = int(2) seq_record. id, seq_record. seq, seq_record. annotations Called data members or attributes Objects can perform actions l l s = 'ACGT'; print s. count('a') Called methods BCHB 524 - Edwards 4
Classes as Concepts l Classes allow us to add new concepts to a language. l Suppose we wanted to add a "DNA sequence" concept to python l l What information should "DNA sequence" capture? What actions or operations should "DNA sequence" provide? BCHB 524 - Edwards 5
DNA Sequence Class l Data members: l l sequence, name, organism. Methods: l length, reverse, complement, reverse. Complement, transcribe, translate percent. GC, init. Met, freq BCHB 524 - Edwards 6
DNA Sequence Class class DNASeq: def reverse(self): return self. seq[: : -1] def complement(self): d = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'} return ''. join(map(d. get, self. seq)) def reverse. Complement(self): return ''. join(reversed(self. complement())) def length(self): return len(self. seq) ds = DNASeq() ds. seq = 'ACGTACGT' ds. name = 'My sequence' print ds. complement(), ds. length(), ds. reverse. Complement() BCHB 524 - Edwards 7
DNA Sequence Class class DNASeq: #. . def length(self): return len(self. seq) def freq(self, nuc): return self. seq. count(nuc) def percent. GC(self): gccount = self. freq('C') + self. freq('G') return 100*float(gccount)/self. length() ds = DNASeq() ds. seq = 'ACGTACGT' ds. name = 'My sequence' print ds. freq('C'), ds. freq('G'), ds. length(), ds. percent. GC() BCHB 524 - Edwards 8
DNA Sequence Class l The special method __init__ is called when a new instance is created. l l Used to initialize data-members. Forces class user to provide valid initial information. class DNASeq: def __init__(self, seq, name): self. seq = seq self. name = name #. . ds = DNASeq('ACGTACGT', 'My sequence') print ds. freq('C'), ds. freq('G'), ds. length(), ds. percent. GC() BCHB 524 - Edwards 9
DNA Sequence Class l Somtimes __init__ is used to set up an "empty" instance. l Other methods or data-members used to instantiate class DNASeq: def __init__(self): self. seq = "" self. name = "" def read(self, filename): self. seq = ''. join(open(filename). read(). split()) #. . ds = DNASeq() ds. name = 'Anthrax SASP' ds. read('anthrax_sasp. nuc') BCHB 524 - Edwards 10 print ds. freq('C'), ds. freq('G'), ds. length(), ds. percent. GC()
DNA Sequence Class l Default arguments allow us to set up "empty", partial, or completely instantiated instances. class DNASeq: def __init__(self, seq="", name=""): self. seq = seq self. name = name def read(self, filename): self. seq = ''. join(open(filename). read(). split()) #. . ds = DNASeq(name='Anthrax SASP') ds. read('anthrax_sasp. nuc') print ds. freq('C'), ds. freq('G'), ds. length(), ds. percent. GC() BCHB 524 - Edwards 11
Complete DNASeq. py Module class DNASeq: def __init__(self, seq="", name=""): self. seq = seq self. name = name def read(self, filename): self. seq = ''. join(open(filename). read(). split()) def reverse(self): return self. seq[: : -1] def complement(self): d = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'} return ''. join(map(d. get, self. seq)) def reverse. Complement(self): return ''. join(reversed(self. complement())) def length(self): return len(self. seq) def freq(self, nuc): return self. seq. count(nuc) def percent. GC(self): gccount = self. freq('C') + self. freq('G') return 100*float(gccount)/self. length() BCHB 524 - Edwards 12
Complete DNASeq. py Module l Describe class in a module, then access using an import statement from DNASeq import DNASeq ds = DNASeq('ACGTACGT', 'My sequence') print ds. complement(), ds. length(), ds. reverse. Complement() print ds. freq('C'), ds. freq('G'), ds. length(), ds. percent. GC() ds = DNASeq() ds. read('anthrax_sasp. nuc') print ds. complement(), ds. length(), ds. reverse. Complement() print ds. freq('C'), ds. freq('G'), ds. length(), ds. percent. GC() BCHB 524 - Edwards 13
A class for codon tables Method calls, for instance "codons": l codons. read(filename) l l codons. amino_acid(codon) l l returns single amino-acid represented by a codon with N's codons. startswith_init(seq) l l returns true if codon is an initiation codon false, otherwise codons. get_ambig_aa (codon) l l returns amino-acid symbol for codons. is_init(codon) l l stores the contents of filename in the codon_table object. returns true if DNA sequence seq starts with init codons. translate(seq, frame) l returns amino-acid sequence for DNA sequence seq BCHB 524 - Edwards 14
A class for codons from DNASeq import * from codon_table import * import sys if len(sys. argv) < 3: print "Require codon table and DNA sequence on command-line. " sys. exit(1) codons = codon_table() codons. read(sys. argv[1]) seq = DNASeq() seq. read(sys. argv[2]) if codons. startswith_init(seq): print "Initial codon is an initiation codon" for frame in (1, 2, 3): print "Frame", frame, "(forward): ", codons. translate(seq, frame) BCHB 524 - Edwards 15
A class for codons l In codon_table. py: class codon_table: def __init__(self): self. table = {} def read(self, filename): # magic def amino_acid(self, codon): # magic return aa def is_init(self, codon): # magic return result def get_ambig_aa(self, codon): # magic return aa def startswith_init(self, seq): # magic return result def translate(self, seq, frame): # magic return aaseq BCHB 524 - Edwards 16
Side by side from My. Nuc. Stuff import * from codon_table import * import sys from DNASeq import * from codon_table import * import sys if len(sys. argv) < 3: print "Require codon table and" , "DNA sequence on command-line. " sys. exit(1) codons = read_codons(sys. argv[1]) codons = codon_table() codons. read(sys. argv[1]) seq = read_seq(sys. argv[2]) seq = DNASeq() seq. read(sys. argv[2]) if is_init(codons, seq[: 3]): print "Initial codon" if codons. startswith_init(seq): print "Initial codon" print translate(codons, seq, 1) print codons. translate(seq, 1) BCHB 524 - Edwards 17
Exercise l Convert your modules for DNA sequence and codons to a codon_table and DNASeq class. l Demonstrate the use of this module and the codon table module to translate an amino-acid sequence in all six-frames with just a few lines of code. l Hint: just import the new classes from their module(s) and call the necessary methods/functions! BCHB 524 - Edwards 18
Homework 8 l Due Monday, November 5 th. l Exercise from Lecture 16 l Exercise from Lecture 17 BCHB 524 - Edwards 19
- Slides: 19