Comment puis-je créer dynamiquement des classes dérivées d'une classe de base

Par exemple, j'ai une classe de base comme suit:

class BaseClass(object):
    def __init__(self, classtype):
        self._type = classtype

À partir de cette classe je tire plusieurs autres classes, par exemple

class TestClass(BaseClass):
    def __init__(self):
        super(TestClass, self).__init__('Test')

class SpecialClass(BaseClass):
    def __init__(self):
        super(TestClass, self).__init__('Special')

Est-il gentil, pythonic façon de créer ces classes dynamiquement par un appel de fonction qui met les nouvelles de la classe dans mon périmètre actuel, comme:

foo(BaseClass, "My")
a = MyClass()
...

Qu'il y aura des commentaires et des questions pourquoi j'ai besoin de ceci: Les classes dérivées tous ont exactement la même structure interne, avec cette différence, que le constructeur prend un certain nombre de indéfini d'arguments. Ainsi, par exemple, MyClass prend les mots-clés a alors que le constructeur de la classe TestClass prend b et c.

inst1 = MyClass(a=4)
inst2 = MyClass(a=5)
inst3 = TestClass(b=False, c = "test")

Mais ils ne devraient JAMAIS utiliser le type de la classe comme argument d'entrée comme

inst1 = BaseClass(classtype = "My", a=4)

J'ai eu ce travail, mais préfère l'autre sens, c'est à dire de créer dynamiquement des objets de la classe.

  • Juste pour être sûr, vous voulez que le type de l'instance de changer en fonction des arguments fournis? Comme si je donne un a il sera toujours MyClass et TestClass ne seront jamais prendre une a? Pourquoi ne pas déclarer toutes les 3 arguments dans BaseClass.__init__() mais par défaut de tous à None? def __init__(self, a=None, b=None, C=None)?
  • Je ne peux rien déclarer dans la classe de base, que je ne connais pas tous les arguments que je pourrais utiliser. Je pourrais avoir 30 clases avec 5 différents arguments de chacun, afin de déclarer 150 arguments dans le constructur n'est pas une solution.
InformationsquelleAutor Alex | 2013-03-06