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 :

Héritage de propriétés avec décorateur property


Sujet :

Python

  1. #1
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut Héritage de propriétés avec décorateur property
    Salut,

    Bon, je pense que la réponse à ma question est non, ce qui confortera encore plus mon opinion concernant les setters et getters python

    Une classe A avec tout plein de propriétés @property
    Une classe B, et une classe C qui héritent toutes deux de A.

    Maintenant B, peut avoir accès aux propriétés définies dans A, mais ne peut les redéfinir.
    Tandis que C peut les redéfinir, sauf que si on utilise des @blabla.setter, on se mange des « NameError: name 'blabla' is not defined » , nan mais sérieux, faut redéfinir tous les property du parent, alors que si j'avais fait des trucs standards getBlabla, j'aurais pas ce problème.

    Donc y'a t-il un moyen de forcer l'héritage d'assesseurs défiinis avec property ?

    Merci.
    Le temps ronge l'amour comme l'acide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    @blabla.setter ne fonctionnera que si "blabla" est dans le "scope" de la définition de la classe (il n'ira pas le chercher dans les ascendants).
    Il faut écrire quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class C(A):
        blabla = property(A.blabla.__get__)
        @blabla.setter
        def blabla(self, v):
             ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    En effet, c'est déjà bien moins verbeux de cette façon, merci pour l'astuce

    Mais c'est quand même bien dommage cette limitation contre naturelle.
    Le temps ronge l'amour comme l'acide.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par bistouille Voir le message
    En effet, c'est déjà bien moins verbeux de cette façon, merci pour l'astuce

    Mais c'est quand même bien dommage cette limitation contre naturelle.
    Il faut revoir la base des property (sans le decorateur)...
    On associe à l'attribut "blabla" des méthodes __get__, __set__,... qui en font une instance de.
    Lorsqu'on accède à "blabla" on va chercher la méthode correspondante dans cette instance là...
    Dit autrement, on a A qui définit une boîte "blabla" avec les méthodes x, y, z et B qui définit une autre boîte "blabla" avec d'autres méthodes. L'héritage, c'est surcharger la boîte pas les méthodes qui sont dedans (c'est la raison qui fait qu'il faut le faire explicitement).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Oui, ok, c'est beau tout ça, reste que c'est vraiment m...

    L'intérêt tombe à 0 si on doit se coltiner chaque fois de redéfinir les assesseurs dans les classes dérivées, déjà utiliser les décorateurs c'est très verbeux, mais si en plus on doit en rajouter une couche, pour ma part je vais rester à la bonne vieille méthode setTruc, getTruc.
    Le temps ronge l'amour comme l'acide.

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Bonsoir,

    J'ai pas forcément tout compris, mais j'espère ne pas trop tomber à côté avec cette réponse.

    Bonne soirée...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Tu as tout compris, c'est ce qu'avait précisé wiztricks
    Le temps ronge l'amour comme l'acide.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par bistouille Voir le message
    L'intérêt tombe à 0 si on doit se coltiner chaque fois de redéfinir les assesseurs dans les classes dérivées, déjà utiliser les décorateurs c'est très verbeux, mais si en plus on doit en rajouter une couche, pour ma part je vais rester à la bonne vieille méthode setTruc, getTruc.
    Le gros soucis lorsqu'on apprend un autre langage, c'est qu'on essaie d'apprendre par analogie. Dans le cas particulier les property en Python c'est comme du canada dry: çà ressemble aux properties, mais c'est un faux ami.

    Un truc sympa pour faire comme si est d'ajouter du "late-binding":
    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
    class A:
     
        def get_blabla(self):
            return self._blabla
     
        def set_blabla(self, v):
            print('A')
            self._blabla = v
     
        blabla = property(lambda self: self.get_blabla(),
                          lambda self, v: self.set_blabla(v))
     
    class B(A):
        _blabla = 0
     
        def set_blabla(self, v):
            print('B')
            self._blabla = v
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Le gros soucis lorsqu'on apprend un autre langage, c'est qu'on essaie d'apprendre par analogie. Dans le cas particulier les property en Python c'est comme du canada dry: çà ressemble aux properties, mais c'est un faux ami.
    J'aime bien le terme canada dry
    Je cherchais justement un terme pour qualifier ça.


    Citation Envoyé par wiztricks Voir le message
    Un truc sympa pour faire comme si est d'ajouter du "late-binding"
    Purée, j'ai mit 10 minutes à tester et comprendre comment ça fonctionnait, c'est pas pas mal ce système.
    C'est pas ce que recherchais, mais cette astuce peut toujours être utile dans d'autres circonstances.

    Merci.
    Le temps ronge l'amour comme l'acide.

Discussions similaires

  1. [MOSS 2007]Recherche avancée : proprité avec un quote
    Par royto dans le forum SharePoint
    Réponses: 6
    Dernier message: 14/09/2007, 14h43
  2. Réponses: 7
    Dernier message: 17/07/2007, 16h13
  3. Réponses: 12
    Dernier message: 23/04/2007, 16h37
  4. héritage de formulaire avec VB Express
    Par ec dans le forum Windows Forms
    Réponses: 6
    Dernier message: 29/01/2007, 20h18
  5. [Composant] publier une propriété avec un type perso
    Par jpc34 dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/10/2004, 08h39

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