Bonjour,
Je voudrais créer une classe M qui soit un moule pour créer des instances étant elles-mêmes des classes C, chaque classe C créée devant prendre pour nom un string fourni en argument à la classe-moule.
Est-ce possible ?
Bonjour,
Je voudrais créer une classe M qui soit un moule pour créer des instances étant elles-mêmes des classes C, chaque classe C créée devant prendre pour nom un string fourni en argument à la classe-moule.
Est-ce possible ?
bonjour,
c'est tout à fait possible, bienvenue dans la méta programmation
le premier argument correspond au nom de la classe, le second est un tuple des classes de bases (comme lorsqu'on déclare une classe avec class) et le dernier argument est un dictionnaire contenant les attributs/méthodes de la classe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 def hello(self): print "hello from %s" % self.__getattribute__("__class__").__name__ Point2D = type("Point2D",(object,),{'x':0.0,'y':0.0,'hello':hello}) p=Point2D() p.hello() >>> hello from Point2D
De manière plus générale, ce type de mécanisme est lié aux métaclasses.
type n'est pas seulement une fonction, c'est aussi la métaclasse par défaut de python.
les classes sont instanciées pour créer des objets, les métaclasses sont instanciées pour créer des classes.
pour instancier une métaclasse, on lui donne en général le nom de la classe à créer, un tuple de classes de base et un dictionnaire sur les attributs.
Nous pouvons créer nous même nos propres métaclasse en dérivant de type:
Ce qui revient à faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class MaMeta(type): def __new__(cls,name,bases,d): d["__MaMetaFlag__"] = True return type.__new__(cls,name,bases,d) Point3D = MaMeta("Point3D",(object,),{'x':0.0,'y':0.0,'z':0.0}) p=Point3D() print p.__MaMetaFlag__ >>> True
Les métaclasses, quand on met les mains dedans, on peut plus s'en passer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class Point3D(object): __metaclass__ = MaMeta x = 0.0 y = 0.0 z = 0.0![]()
La vache. Tout ça en 12 minutes !
Bon, j’avais quelque idée que les métaclasses existaient et permettaient de faire ça, mais j’ai été un peu feignant, je n’ai pas cherché suffisamment.
Avec ta réponse je vais au plus court, merci bien.
Partager