Фабричные объекты часто не считаются очень питоническими;Столкнувшись с такой проблемой, объекты первого класса, методы или функции обычно являются лучшим подходом:
class Pet:
pass
class Cat(Pet):
pass
class Dog(Pet):
pass
pets = {'cat': Cat, 'dog': Dog}
if __name__ == "__main__":
pet = input()
my_pet = pets[pet]()
Иногда API предоставляет набор конструкторов через фабрики, чье имя начинается с from_...
def from_pet_name(pet: str)-> Pet:
return pets[pet]()