Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / héritage multiple

héritage multiple

Remonter à Forum général Python
  • héritage multiple

    Envoyé par stefa le 27 Août 2007 à 10:12
    Bonjour à tous,

    J'ai un programme qui permet de faire deux traitements trait1, trait2. L'utilisateur peut choisir de faire un des deux traitements ou les deux. Les deux traitements ayant une partie commune, je pensais faire ce type de conception:

    class Trait(object)
    class Trait1(Trait)
    class Trait2(Trait)
    Class Trait1Et2(Trait1, Trait2)

    La classe Trait va définir une méthode compute() qui réalise le traitement générique.
    Les classes Trait1 et Trait2 redéfinissent chacune cette méthode pour réaliser en plus leur traitement spécifique :

    class Trait(object):
    def compute():
    #traitement commun
    class Trait1(Trait):
    def compute():
    Trait.compute() # appel du traitement commun
    #traitement spécifique à trait1
    class Trait2(Trait):
    def compute():
    Trait.compute() # appel du traitement commun
    #traitement spécifique à trait2
    Class Trait1Et2(Trait1, Trait2):
    def compute():
    Trait1.compute() # appel du traitement 1
    Trait2.compute() # appel du traitement 2


    Le problème de l'appel de compute() pour une instance de Trait1Et2 est que le traitement commun (méthode compute() de la classe Trait) sera exécuté deux fois.
    Comment faire pour qu'il ne soit appelé qu'une fois ? Est-ce que cette structure d'héritage multiple est déconseillé ?

    Merci pour vos réponses.
    • Re: héritage multiple

      Envoyé par Fructidor le 27 Août 2007 à 12:15
      Bonjour,

      je pense que le plus simple est de deleguer les traitements dans une methode, par exemple _compute, et d'appeler les bonnes methodes dans compute suivant la classe.
      On pourait aussi de le faire par introspection, grace a une liste qui contient la liste des super classes, ordonnee et avec unicite (__mro__). Par exemple:

      class Trait(object):
      def _compute(self):
      print 'traitement commun'

      def compute(self):
      for i in self.__class__.__mro__:
      #print i
      if hasattr(i,'_compute'):
      i._compute(self)

      class Trait1(Trait):
      def _compute(self):
      print 'traitement specifique a trait1'

      class Trait2(Trait):
      def _compute(self):
      print 'traitement specifique a trait2'

      class Trait1Et2(Trait1, Trait2):
      def _compute(self):
      pass

      def main():
      Trait1Et2().compute()
      print '---'
      Trait1().compute()

      main()

    • Re: héritage multiple

      Envoyé par stefa le 27 Août 2007 à 13:13
      Merci pour ta réponse. Ca fonctionne comme je veux.
Rendu par Ploneboard