Jan-04-2018, 11:10 PM
(This post was last modified: Jan-04-2018, 11:10 PM by Gribouillis.)
If you really need to convert strings, you could use a metaclass to collect the subclasses
class PetMeta(type): pet_classes = {} def __new__(cls, clsname, superclasses, attributedict): if clsname in cls.pet_classes: raise ValueError( "Redefinition of Pet subclass '{}'".format(clsname)) tp = type.__new__(cls, clsname, superclasses, attributedict) cls.pet_classes[clsname] = tp return tp def pet_class(name): return PetMeta.pet_classes[name] class Person: def __init__(self, pet_types): self.pets = [pet_class(t)() for t in pet_types] class Pet(metaclass=PetMeta): pass class Dog(Pet): pass class Cat(Pet): pass class Bird(Pet): pass john = Person(['Dog', 'Cat']) print(john.pets)The drawback of
__subclasses__()
is that it only knows direct subclasses.