IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Une classe pour mouler des instances qui soient des classes


Sujet :

Python

  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut Une classe pour mouler des instances qui soient des classes
    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 ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    c'est tout à fait possible, bienvenue dans la méta programmation

    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
    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.

    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:

    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
    Ce qui revient à faire:

    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
    Les métaclasses, quand on met les mains dedans, on peut plus s'en passer

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    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.

Discussions similaires

  1. Une seule ListView pour plusieurs fichier php qui renvoie des données JSON
    Par max8392 dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 22/08/2014, 10h46
  2. Réponses: 4
    Dernier message: 03/06/2011, 08h20
  3. Réponses: 9
    Dernier message: 20/10/2010, 10h57
  4. Réponses: 6
    Dernier message: 08/06/2010, 12h15
  5. Réponses: 3
    Dernier message: 02/06/2010, 07h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo