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 :

surcharge de float __new__


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut surcharge de float __new__
    Bonjour à Tous,
    après avoir consulté la FAQ,
    je tente de surclasser un Float (à ma façon !!!!) en lui ajoutant des arguments


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Val(float):
        def __new__(self,n,Case=None,Z=0,Type="Max"):
    	self.Case=Case
    	self.Z=Z
            return float.__new__(self,n)
     
     
     
    >>> toto=Val(4,5,3)
    >>> print toto,toto.Case,toto.Z
    4.0 5 3
    # jusque la, tous va bien !!!
    par contre si je j'instance un nouvel objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> titi=Val(55,"d","f")
    >>> print titi,titi.Case,titi.Z
    55.0 d f
    Cela marche toujours, mais ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> print toto,toto.Case,toto.Z
    4.0 d f
    le premier n'est plus bon .....

    Si quelqu'un peut m'expliquer .... je pensai avoir correctement encapsulé mes données ...

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Oulàlà…

    D’abord, utilise plutôt les balise code (le # dans la barre d’outil), plutôt que les citations, pour ton code –*sinon, les indentations sont perdues…

    Ensuite, ce n’est pas __new__ qu’il te faut, mais __init__*!

    En effet, __new__ n’a pas self (c-à-d une instance de la classe déjà construite) comme premier paramètre, mais la classe elle-même. Il est précisément chargé de construire une instance à partir de cette classe*!

    C’est d’ailleurs pour ça que tes Case, Z etc. se propagent entre tes instances, vu que dans __new__, tu les assignes à la classe, et pas à l’instance.

    Donc, ton code devrait plutôt ressembler à ça*:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Val(float):
        def __init__(self, n, Case=None, Z=0, Type="Max"):
            self.Case = Case
            self.Z = Z
            return float.__init__(self, n)

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,
    le premier paramètre de __new__ est la classe... et comme sa fonction est d'allouer il devra retourner une instance qui peut être "initialisée" dans la foulée.
    Ca pourrait s'écrire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Val(float):
        def __new__(cls, n, Case=None, Z=0, Type="Max"):
            instance = float.__new__(cls, n)
            instance.Case = Case
            instance.Z = Z
            return instance
    Mais l'utilisation d'une telle artillerie pour sous-classer les types de base ne se justifie que pour ceux dit "immutables" tels tuple, int,...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Merci beaucoup, pour vos réponses, la dernière me convient parfaitement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37
  2. Réponses: 5
    Dernier message: 24/04/2003, 11h47
  3. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  4. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32
  5. Réponses: 8
    Dernier message: 20/11/2002, 11h50

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