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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    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 émérite
    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
    Par défaut
    C'est certainement possible en regardant du côté des métaclasses

  3. #3
    Membre émérite
    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
    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 émérite
    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
    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 émérite
    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
    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 émérite
    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
    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 émérite
    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
    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 )

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