https://levelup.gitconnected.com/python-principles-of-writing-object-oriented-code-part-1-e811f10aa427