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 :

construire automatiquement les classes dérivée a une class mere


Sujet :

Python

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut construire automatiquement les classes dérivée a une class mere
    bonjour,


    voila , j'ai une structure de code suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Rule:
        pass
     
    class subRule1(Rule):
       pass
     
    class subRule2(Rule):
       pass


    j'aurais voulu savoir si il y a moyen d'avoir toutes les sous class dérivées de rule et d'en construire un objet?

    par exemple un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for s in Rule.__SubClasses__:
        subrule = s()

    y a t il moyen ??

    merci

    a++

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    C'est certainement possible en regardant du côté des métaclasses

  3. #3
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    En effet, tu peux passer par une metaclasse, le concept de metaclasse est assez spécial et trop complexe pour que je sache l'expliquer clairement. Toutefois un recherche sur python.org du mot-clé metaclass te donnera accès à des liens vers des articles traitant de ce sujet. Quoiqu'il en soit, voici le code concernant ta demande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    >>> class Meta(type):
    	def __new__(cls, name, bases, attr):
    		if name=='Rule':
    			attr['__subclasses__']=[]
    			return type.__new__(cls,name,bases,attr)
    		else:
    			clss=type.__new__(cls,name,bases,attr)
    			Rule.__subclasses__.append(clss)
    			return clss
     
     
    >>> class Rule(object):
    	__metaclass__=Meta
     
     
    >>> class Foo1(Rule):
    	pass
     
    >>> Rule.__subclasses__
    [<class '__main__.Foo1'>]
    >>> Rule.__subclasses__[0]()
    <__main__.Foo1 object at 0x9cf0aac>

  4. #4
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    A noter que si tu travailles avec Python 3.0, il faut insérér la métaclasse différemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Rule(object, metaclass=META):
        pass

  5. #5
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Tiens, c'est bon à savoir ça . Ceci dit, je pense qu'ici tu voulais dire Meta et non META ... ?

  6. #6
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    uh... euh, oui oui

    Ah, je viens de remarquer un attribut __subclasshook__ dans les classes de Python 3.0
    J'ai appelé la méthode évidemment, mais...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> Rule.__subclasshook__()
    NotImplemented
    A suivre donc

  7. #7
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    En fait apparemment, __subclasshook__ servirait a personnaliser le comportement de la classe lors d'un appel de issubclass(), mais j'en sais rien de plus (Merci Idle )

  8. #8
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Ah ça peut être intéressant

    Merci pour l'info

  9. #9
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut
    salut,

    en fait, j'ai trouver tres simple,
    la class mere doit derivé de object et alors il y a subclass

    class X(object): pass
    class Y(X): pass
    class Z(X): pass
    class W(Y): pass

    >>> print X.__subclasses__()
    [<class '__main__.Y'>, <class '__main__.Z'>]


    l'exemple vient d'ici et fonctionne avec python2.6 pour 3.0 je sais pas trop .

    http://mail.python.org/pipermail/pyt...ry/123451.html

    a+/+

  10. #10
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Ah ouais

    Petain, fallait vraiment savoir... merci

  11. #11
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Mais lol

    Comme quoi, Python c'est bien

  12. #12
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Points : 149
    Points
    149
    Par défaut
    Je crois que dans la version 3 il n'y a plus besoin de faire hériter les class d'objet car se sera par défaut des class new style
    http://www.python.org/doc/newstyle/

    C'est bizarre ça
    j'ai suivie ton exemple et avec la classe X j'ai fais ça
    >>> dir(X)
    ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__']


    Pourquoi il n'y pas la méthode __subclasses__() ?

  13. #13
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Y'a beaucoup d'attributs et de méthodes que dir() ne montre pas... Je suppose que c'est à cause de la façon dont c'est codé... Idle et son auto-completion en montre plus, mais cet attribut par exemple, passe au travers des mailles...

    Ah... les voies de python ne sont pas toujours facilement penetrables...

  14. #14
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Il m'a semblé que la fonction dir avait changé entre Python 2.5.2 et 2.5.4... Avant je voyais tout, absolument tout. Mais mnt plus Mais je sais que dir se base sur quelque chose (logique en soi). Reste plus qu'à me souvenir de quoi.

  15. #15
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Points : 149
    Points
    149
    Par défaut
    Je viens de remarquer un truc de sympa dans mon terminal j'ai rajouté l'autocomplétion des fonction python ...
    avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import rlcompleter
    import readline
    readline.parse_and_bind("tab: complete")
    plus d'info ici
    http://kanorblog.wordpress.com/

    et donc la on voit la fonction __subclass__

  16. #16
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Wow ! Depuis le temps que je regrette que la touche tab ne fonctionne pas sous Python...

    Alors là un énorme MERCI !

    PS: je vote pour que cette astuce soit mise en sticky

  17. #17
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    En effet, merci

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 388
    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 388
    Points : 36 938
    Points
    36 938
    Par défaut autres methodes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    klass = type(object)(str(klass_name), (object,), {})
    il y a une variante avec classobj.

    Et aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval ('class %s(parent): pass' % K)
    -W

Discussions similaires

  1. accéder à classe dérivée via une classe de base
    Par wirenth dans le forum Langage
    Réponses: 6
    Dernier message: 28/09/2011, 11h23
  2. Réponses: 7
    Dernier message: 05/04/2011, 17h19
  3. Réponses: 6
    Dernier message: 12/01/2011, 12h15
  4. Réponses: 2
    Dernier message: 02/02/2008, 07h37
  5. Réponses: 7
    Dernier message: 29/11/2007, 16h03

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