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 brahici le 1 Juin 2010 à 14:18
    Cher Forum,

    Je (en fait nous sommes plusieurs mais bon) coince sur un problème d'héritage multiple.

    Nous avons besoin de faire une classe qui aurait cette définition
    class Float(Decimal, float):
    ....

    Malheureusement, Python ne veut rien savoir, on reste sur une exception TypeError: multiple bases have instance lay-out conflict.

    J'ai regardé pour surcharger __new__ ou utiliser __metaclass__, mais sans succès. Notamment parce que ceci donne aussi une exception TypeError:
    >>> type.__new__(type, "Float", (Decimal, float), {})
    Traceback (most recent call last):
    File "", line 1, in
    TypeError: multiple bases have instance lay-out conflict

    L'idée est que nous puissions avoir ce type de résultat:
    isinstance(Float('1'), float) == True
    isinstance(Float('1'), Decimal) == True

    Y-aurait-il une autre piste à explorer ? Ou bien tentons-nous de faire quelquechose d'impossible pour Python ?

    Merci pour vos futurs avis éclairés.

    B.

    • Re: Héritage multiple

      Envoyé par brahici le 2 Juin 2010 à 08:49
      oups. j'ai oublié de préciser que nous utilisons les versions 2.5.2 et 2.6.5 de python.
    • Re: Héritage multiple

      Envoyé par jacko le 8 Juin 2010 à 17:22
      Bonjour,

      Voici quelques éléments de réflexion.
      Comme le dit le message d'erreur, l'implémentation interne des deux classes est incompatible. Ceci arrive avec les types built-in, qui ont un comportement codé "en dur".

      En fait, cela n'aurait pas de sens de dériver simultanément de ces deux classes. Ainsi :
      - les instances de float ne peuvent avoir d'attribut utilisateur (car pas de __dict__), alors que les instances de Decimal le peuvent. Quid des instances d'une classe dérivant des deux classes ?
      - une instance de Decimal fait des calculs exacts (car en entiers), alors qu'une instance de float fait des calculs arrondis. Que ferait une instance d'une classe dérivée des deux ?

      Une classe qui dériverait simultanément de "Decimal" et de "float" serait comme une classe dérivant simultanément de "list" et de "dict" : quelle serait son comportement ?

      Une solution serait de redéfinir une classe "normale" ayant les mêmes propriétés de calcul que float :

      import __builtin__
      class float(object):
      def __init__(self,val):
      self.__val=__builtin__.float(val)
      def __add__(self,other):
      return self.__val+other

      puis redéfinir les opérateur +,-,*, etc. avec les méthode __add__, __sub__, etc. Vous pourrez alors créer votre classe Float dérivant simultanément de Decimal et float. Utile ?

Rendu par Ploneboard