As a side note, while not particularly recommended, it IS possible to assign a different value to self.__class__
-- be that in __init__
or anywhere else. Do notice that this will change the lookups for class-level names (such as methods), but per se it will not alter the instance's state (nor implcitly invoke any kind of initialization -- you'll have to do it explicitly if you need that to happen)... these subtleties are part of why such tricks are not particularly recommended (along with the general cultural bias of Pythonistas against "black magic";-) and a "factory function" (which in especially simple cases can be reduce to a dict lookup, as in GHZ's answer) is the recommended approach.