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 :

Constructeur classe dérivée à partir d'objets parents


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut Constructeur classe dérivée à partir d'objets parents
    Bonjour à tous,
    Juré, craché j'ai fait une recherche sur ce forum avant de poster.
    Je vais essayer de faire simple:
    J'utilise l'objet Element de la librairie lxml (bonne librairie, au passage).
    Cet objet en l'état ne convient pas complètement à mes besoins, il lui manque une donnée 'poids' que je calculerai en utilisant certaines règles.
    L'idée naturelle est donc de construire mon objet MyElement en le dérivant de Element, et de rajouter une donnée 'poids'.
    Problème: Je veux instancier mes objets à partir d'objets EXISTANTS de type 'Element'.
    Je ne sais pas comment faire avec mes connaissances actuelles.
    Bien sûr je peux toujours 'agréger' sans dériver, définir MyElement comme ayant une donnée membre de type Element et une donnée poids et puis passer les deux arguments à __init__, mais cette solution je ne m'y résoudrai qu'en dernier recours, pour beaucoup de raisons (ne pas réécrire l'itérateur, etc.. etc..)
    Je recherche donc une solution du type:
    class MyElement(etree.Element):
    ..........
    Quelqu'un a une idée ?
    Merci.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Salut Zavonen,

    As-tu tenté de modifier la classe de ton objet?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> class A(object):
    ...     def __init__(self, x):
    ...         self.x = x
    ... 
    >>> class B(A):
    ...     def ecrire(self):
    ...         print self.x
    ... 
    >>> obj = A('toto')
    >>> obj.__class__ = B
    >>> obj.ecrire()
    toto

  3. #3
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Bonjour Pacificator,
    Merci pour ta réponse.
    Dans mon cas cela ne fonctionne pas. En effet, je ne veux pas toucher à la classe de base. Pas question donc de modifier le __init__ de Element.
    J'ai résolu mon problème de la façon suivante. On peut définir pour tout 'tag' des attributs ad libitum (mais seulement de type litteral). Bref, pour mes calculs je peux faire des conversions et sauver les résultats sous forme de string dans un attribut du tag.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from lxml import etree
    root = etree.Element("root")
    root.set("poids",unicode(1))
    root.set("poids", unicode((int(root.get("poids"))*2)))
    print root.get("poids")
    Bon, mais ce n'est pas 'clean' et cela ne répond pas à ma question.
    Je te passe un message perso bientôt.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  4. #4
    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
    J'ai pas très bien compris, est-ce que ceci marcherait comme tu le voudrais ?
    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
    >>> class Foo(object):
    	def __init__(self):
    		self.arg1=5
     
     
    >>> class Foo2(Foo):
    	def __init__(self):
    		super(Foo2,self).__init__() #apelle la méthode __init__ de Foo et l'applique sur cette instance (grossièrement)
    		self.arg2=6
     
     
    >>> a=Foo2()
    >>> a.arg1
    5
    >>> a.arg2
    6
    >>>
    Ca nous permet de surcharger une méthode, tout en utilisant également celle de la classe parente.

  5. #5
    Membre expérimenté Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Par défaut par A.__init__(self)
    Bonjour,
    Est ce que la forme (très courante) d'instanciation peux convenir ?

    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
    class A :
        def __init__(self,param_x):
            self.x=param_x
            
        def affiche(self):
            print self.x
            
    
    class B(A):
        def __init__(self,param_x_pour_A):
            A.__init__(self,param_x_pour_A)
            
    b=B(5)
    b.affiche()
    Alex

  6. #6
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Hélas, aucune de vos propositions ne peut me convenir.
    je souhaite avoir une instanciation de la classe dérivée à partir d'un objet (déjà instancié) de la classe parent.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

Discussions similaires

  1. constructeur classe dérivée
    Par Nayila dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2007, 16h49
  2. cast d'objet parent en classe fille
    Par Plio dans le forum C++
    Réponses: 2
    Dernier message: 05/10/2007, 13h58
  3. Réponses: 8
    Dernier message: 17/04/2007, 11h35
  4. [c#]Constructeur de classe dérivée
    Par b4u dans le forum C#
    Réponses: 5
    Dernier message: 16/11/2006, 00h57
  5. creation d'objet de classe a partir de string
    Par mencaglia dans le forum C++
    Réponses: 1
    Dernier message: 14/03/2006, 09h56

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