Intermediate classes: Difference between revisions
Jump to navigation
Jump to search
| Line 20: | Line 20: | ||
# Let's do something natural. Make it possible to add one FastaInstance to another using the '''+=''' operator, like this:<div style="font-family:'Courier New'">FastaInstance1 += FastaInstance2<br></div>The headers and sequences in Fastainstance2 should be added (list extension) to the headers and sequences in FastaInstance1. Use the magic method [https://zetcode.com/python/dunder-iadd/ '''__iadd__'''].<br><br> | # Let's do something natural. Make it possible to add one FastaInstance to another using the '''+=''' operator, like this:<div style="font-family:'Courier New'">FastaInstance1 += FastaInstance2<br></div>The headers and sequences in Fastainstance2 should be added (list extension) to the headers and sequences in FastaInstance1. Use the magic method [https://zetcode.com/python/dunder-iadd/ '''__iadd__'''].<br><br> | ||
# Implement the ''addition'', using [https://zetcode.com/python/dunder-add/ '''__add__''']. Addition creates a new Fasta instance, but leaves the originals untouched.<div style="font-family:'Courier New'">FastaInstance3 = FastaInstance1 + FastaInstance2<br></div>The resulting Fasta object must contain the headers and sequences from FastaInstance1 and FastaInstance2 in that order. Note that this works as an alternative constructor.<br><br> | # Implement the ''addition'', using [https://zetcode.com/python/dunder-add/ '''__add__''']. Addition creates a new Fasta instance, but leaves the originals untouched.<div style="font-family:'Courier New'">FastaInstance3 = FastaInstance1 + FastaInstance2<br></div>The resulting Fasta object must contain the headers and sequences from FastaInstance1 and FastaInstance2 in that order. Note that this works as an alternative constructor.<br><br> | ||
# You can consider a '''Fasta''' instance as a ''set'' of headers/sequences. The sequences are obviously uniquely identified by the identifier in the header, which is what will be used as key in the set operations. In the rest of the exercises we will explore inheritance by making a new class called '''FastaSet''', which inherits from the '''Fasta''' class.<br>A) The original '''__init__''', '''save''', '''load''', '''insert''', the iteration and the corresponding '''deletethis''', '''insertthis''', '''verifythis''' and '''discardthis''' methods are fine to keep in the new class (meaning do nothing about them).<br>B) To help in the new class create a new getter method '''identifiers''', which returns a list of identifiers from the header lines.<br>C) Override the '''content''' method such that it takes a set or list of identifiers and returns only the headers/sequences that corresponds to the identifiers in the list. If you do not specify a list/set of identifiers, it still returns all.<br>D) Override the '''delete''' method in a similar way - it deletes the headers/sequences that corresponds to the input.<br>E) Override the '''verify''' method in a similar way to '''content'''.<br>F) Override the '''discard''' method in a similar way to '''content'''. | # You can consider a '''Fasta''' instance as a ''set'' of headers/sequences. The sequences are obviously uniquely identified by the identifier in the header, which is what will be used as key in the set operations. In the rest of the exercises we will explore inheritance by making a new class called '''FastaSet''', which inherits from the '''Fasta''' class.<br>A) The original '''__init__''', '''save''', '''load''', '''insert''', the iteration and the corresponding '''deletethis''', '''insertthis''', '''verifythis''' and '''discardthis''' methods are fine to keep in the new class (meaning do nothing about them).<br>B) To help in the new class create a new getter method '''identifiers''', which returns a list of identifiers from the header lines.<br>C) Override the '''content''' method such that it takes a set or list of identifiers and returns only the headers/sequences that corresponds to the identifiers in the list. If you do not specify a list/set of identifiers, it still returns all.<br>D) Override the '''delete''' method in a similar way - it deletes the headers/sequences that corresponds to the input.<br>E) Override the '''verify''' method in a similar way to '''content'''.<br>F) Override the '''discard''' method in a similar way to '''content'''.<br><br> | ||
# As the new FastaSet class is set orientated, implement the following set operations;<br>A) union, operator is '''|''', magic method is '''__or__'''.<br>B) intersection, operator is '''&''', magic method is '''__and__'''.<br>C) difference, operator is '''-''', magic method is '''__sub__'''.<br>D) symmetric difference, operator is '''^''', magic method is '''__xor__'''.<br>This is quite similar to the addition in exercise 4 - a new Fasta object is returned. The identity of the sequence depends on the identifier in the corresponding header. This is an example of operator overloading. | # As the new FastaSet class is set orientated, implement the following set operations;<br>A) union, operator is '''|''', magic method is '''__or__'''.<br>B) intersection, operator is '''&''', magic method is '''__and__'''.<br>C) difference, operator is '''-''', magic method is '''__sub__'''.<br>D) symmetric difference, operator is '''^''', magic method is '''__xor__'''.<br>This is quite similar to the addition in exercise 4 - a new Fasta object is returned. The identity of the sequence depends on the identifier in the corresponding header. This is an example of operator overloading. | ||
== Exercises for extra practice == | == Exercises for extra practice == | ||
Revision as of 15:56, 17 March 2026
| Previous: Beginning classes | Next: Beginning unit test |
Required course material for the lesson
Powerpoint: Classes
Resource: Example code - Classes
Subjects covered
Magic methods in classes
Object Oriented Programming
Polymorphism and inheritance
Practical knowledge
Exercises to be handed in
The first four exercises will continue with the Fasta class from last time.
- Use magic methods to add iteration and length evaluation (using __iter__ and __len__ magic methods) to the Fasta class. Do this so you can write code like if len(MyFastaInstance) > 0:The function len returns the number of sequences.
for header, sequence in MyFastaInstance:
# Do something with header and sequence
print(header, sequence) - Add the methods deletethis(), insertthis(header, sequence), verifythis(alphabet) and discardthis(alphabet) to the Fasta class. The methods should only work when iterating over an instance at the current item, i.e. they work when you are iterating over the fasta sequences on the current sequence and header, like this:for header, sequence in MyFastaInstance:As some may remember, it is normally impossible to successfully iterate straightforward through a list and delete and/or add elements to the list during the iteration. You have to make this possible. Hint: change the way your iteration works in the previous exercise.
if not MyFastaInstance.verifythis("DNA"):
MyFastaInstance.deletethis()
continue
# Do something with header and sequence - Let's do something natural. Make it possible to add one FastaInstance to another using the += operator, like this:FastaInstance1 += FastaInstance2The headers and sequences in Fastainstance2 should be added (list extension) to the headers and sequences in FastaInstance1. Use the magic method __iadd__.
- Implement the addition, using __add__. Addition creates a new Fasta instance, but leaves the originals untouched.FastaInstance3 = FastaInstance1 + FastaInstance2The resulting Fasta object must contain the headers and sequences from FastaInstance1 and FastaInstance2 in that order. Note that this works as an alternative constructor.
- You can consider a Fasta instance as a set of headers/sequences. The sequences are obviously uniquely identified by the identifier in the header, which is what will be used as key in the set operations. In the rest of the exercises we will explore inheritance by making a new class called FastaSet, which inherits from the Fasta class.
A) The original __init__, save, load, insert, the iteration and the corresponding deletethis, insertthis, verifythis and discardthis methods are fine to keep in the new class (meaning do nothing about them).
B) To help in the new class create a new getter method identifiers, which returns a list of identifiers from the header lines.
C) Override the content method such that it takes a set or list of identifiers and returns only the headers/sequences that corresponds to the identifiers in the list. If you do not specify a list/set of identifiers, it still returns all.
D) Override the delete method in a similar way - it deletes the headers/sequences that corresponds to the input.
E) Override the verify method in a similar way to content.
F) Override the discard method in a similar way to content. - As the new FastaSet class is set orientated, implement the following set operations;
A) union, operator is |, magic method is __or__.
B) intersection, operator is &, magic method is __and__.
C) difference, operator is -, magic method is __sub__.
D) symmetric difference, operator is ^, magic method is __xor__.
This is quite similar to the addition in exercise 4 - a new Fasta object is returned. The identity of the sequence depends on the identifier in the corresponding header. This is an example of operator overloading.