class Shape(object):

    def __new__(cls, desc):
        if cls is Shape:
            if desc == 'big':
                return super(Shape, cls).__new__(Rectangle)
if desc == 'small':
    return super(Shape, cls).__new__(Triangle)
else:
    return super(Shape, cls).__new__(cls, desc)
Использование метода класса __new__ в качестве фабрики: __init__ вызывается дважды