La fonction type
permet de définir un type, c'est-à-dire une nouvelle classe:
>>> type('One', (), {})
<class '__main__.One'>
Le second argument est un tuple de base classes, et le troisième le dictionnaire des attributs.
Voilà une génération de deux classes et de leurs attributs:
>>> templates = {'A': {'name': 'test'}, 'B': {'name': 'oulala'}}
>>> for name, attrs in templates.items():
print(type(name, (), attrs))
Dans le cas où tu aurais une liste de noms et une liste de liste d'attributs:
>>> class_names = ('A', 'B')
>>> class_attrs = ({'name': 'coucou'}, {'name': 'test'})
>>> classes = [type(name, (), attrs) for name, attrs in zip(class_names, class_attrs)]
Une autre solution, probablement plus propre, est d'utiliser la stdlib, et la structure namedtuple
, qui est justement adaptée à la création de classes avec des attributs et des noms définits dynamiquement.
>>> from collections import namedtuple
>>> A = namedtuple('A', ['name', 'value'])
>>> a = A('coucou', 42)
>>> a.name, a.value
('coucou', 42)
Pour gérer les valeurs par défaut:
>>> A.__new__.__defaults__ = 'plop', 0
>>> a = A()
>>> a.name, a.value
('plop', 0)