http://xinming90.github.io/2014/10/21/python-add-polymorphism/