I think it would be clearer just to have separate `__init__` methods for each of the subclasses.  There's too much magic here.