https://medium.com/@leandroviajando/python-subclassing-and-dependency-inversion-using-generics-without-violating-liskov-substitution-fc39c4b5eff8