Source: https://www.bioinformatics.babraham.ac.uk/training/Understanding_Object_Orientated_Python/Understanding_Object_Oriented_Programming_in_Python.pdf