Source: http://www.cs.fsu.edu/~jayarama/pythonfa18/Slides/OOP.pdf