https://learncsdesigns.medium.com/understanding-solid-principles-of-object-oriented-software-design-using-python-4702e6866755