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 :

Creer des classes à la volé (metaclass type) [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut Creer des classes à la volé (metaclass type)
    Bonjour,
    je cherche à créer des classes qui héritent de 2 autres classes dynamiquement... mais je suis confronté au message suivant:

    TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

    Voici mon code:

    J'ai une classe qu'on appellera : "vehicle" et qui hérite de :
    QtCore.QObject < MyObject < vehicle
    Ensuite j'ai une classe qu'on appellera : "car" et qui hérite de vehicle
    QtCore.QObject < MyObject < vehicle < car

    Puis j'ai des classes: vehicle_v11, vehicle_v12..
    QtCore.QObject < MyObject < vehicle < vehicle_v11
    QtCore.QObject < MyObject < vehicle < vehicle_v12
    Et en gros moi je veux instancier dynamiquement des versions de "car" mais avec du double héritage.
    Si je déclare ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class Car_v12(car.car, vehicle_v12.vehicle_v12):
         pass
    Et que j'instancie ma classe ça fonctionne.
    EN revanche si je veux m'éviter de creer des modules/classes creuses pour toutes les versions et que je veux faire ça dynamiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CL = type("Car_v12", ("car.car","vehicle_v12.vehicle_v12"), {})
    et j'ai le message d'erreur
    TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

    Et même si je simplifie en faisant du monohéritage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CL = type("Car_v23", ("vehicle",), {})
    j'ai le message d'erreur
    TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

    idem si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CL = type("Car_v23", ("car",), {})
    Je serai vraiment intéressé si quelqu'un pouvait m'éclairer.
    Merci par avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par rockt13 Voir le message
    Je serai vraiment intéressé si quelqu'un pouvait m'éclairer.
    Un peu de recherche sur Google vous donnerait explications et solutions au problème. Et il sera difficile de faire mieux ici.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Bonjour,
    t'imagines bien qu'avant de poster ici j'ai déjà recherché sur google et je n'ai pas trouvé de solutions sinon je ne serai pas là...j'ai vu des choses mais je n'ai pas compris.. d'où ma question

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    j'ai vu des choses mais je n'ai pas compris.. d'où ma question
    En triant un peu, tout est dans cette recette.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Il propose pour résoudre le conflit de spécifier ceci: __metaclass__=classmaker()

    Mais je ne comprend pas pourquoi moi j'ai cette erreur, car mes classes vehicle et car ne sont pas des metaclass ?

    De plus avec la syntaxe type() je ne vois pas comment faire intervenir classmaker

    CL = type("Car_v12", ("car.car","vehicle_v12.vehicle_v12"), {__metaclass__=classmaker()})

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    Mais je ne comprend pas pourquoi moi j'ai cette erreur, car mes classes vehicle et car ne sont pas des metaclass ?
    Certes, mais elles héritent de "class" qui ont peut être des metaclass.

    Citation Envoyé par rockt13 Voir le message
    De plus avec la syntaxe type() je ne vois pas comment faire intervenir classmaker

    CL = type("Car_v12", ("car.car","vehicle_v12.vehicle_v12"), {__metaclass__=classmaker()})
    Ce n'est peut être pas la solution!
    Dans tous les cas, vous devez comprendre le problème avant d'envisager d'utiliser une des solutions proposée ou de construire une solution différente.
    Et là vous touchez du doigt que l'héritage pose aussi des soucis qui font qu'on évite d'en faire une solution magique.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Creer des classe d'age
    Par ratatam25 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 23/12/2008, 22h05
  2. penser objet (creer des classes )
    Par elmcherqui dans le forum C++
    Réponses: 3
    Dernier message: 10/05/2008, 22h34
  3. creer des liens à la volée ?
    Par Alexdezark dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 18/04/2008, 11h22
  4. Creer des classes en vba-E
    Par azerty53 dans le forum Excel
    Réponses: 3
    Dernier message: 31/10/2006, 08h16
  5. Faire un New pour creer des PictureBox à la volée ?
    Par __fabrice dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 19/11/2005, 13h09

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