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 :

Getter / setter et philosophie Python


Sujet :

Python

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut Getter / setter et philosophie Python
    Bonjour,

    Au cours de mes lectures sur les classes en Python, j'ai découvert que la gestion des variables de classe est très libre comparée à celle de C++ (avec qui j'ai appris la POO).

    Sachant que n'importe qui peut accéder aux attributs d'un objet, je me pose la question suivante : faut-il faire des getters et setters ou accéder directement aux champs ? Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Frame:
        def __init__(self, rawdata=""):
            self.rawdata = rawdata
     
    f3 = Frame("bonjour")
    print f3.rawdata
    f3.rawdata ="Hello"
    print f3.rawdata
    J'ai lu qu'on pouvait faire des mécanismes de protection avec property(), comme expliqué par Thierry Chapuis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Son équivalent Python
     
    class MaClasse(object):
        def __init__(self, x):
            self._x = x
     
        # x propery definition
        def getx(self): return self._x
        def sety(self, value): self._x = value
        x = properpy(getx, setx)
    Ne voulant pas forcément reproduire le comportement du C++ avec du Python, ma question se rapporte à la philosophie générale du langage plutôt qu'à savoir comment faire.

    Question au passage : faut-il forcément que ma classe Frame hérite de object ? J'ai lu que c'était obligatoire pour faire des classes new style et je voulais savoir si c'était une bonne pratique.

    Merci d'avance !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    L'avantage en python (versus Java entre autres), c'est que l'usage des getter/setter nécessite en général de modifier que le code de la property et de __init__, et pas le code utilisant la classe donc tant que ce n'est pas nécessaire tu peux faire t'en passer.

    Personnellement, j'utilise majoritairement les property getter pour des informations que je veux calculer de manière fainéante ou qui sont un agrégat d'autres attributs de classes. Et les property setter pour faire des checks lors d'un set.


    Citation Envoyé par Bktero Voir le message
    Question au passage : faut-il forcément que ma classe Frame hérite de object ? J'ai lu que c'était obligatoire pour faire des classes new style et je voulais savoir si c'était une bonne pratique.
    Oui ! Ca permet d'utiliser la fonction super() ; c'est automatique pour python3X

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

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    ma question se rapporte à la philosophie générale du langage plutôt qu'à savoir comment faire.
    La philosophie de python est de croire que les programmeurs sont des personnes responsables, qui savent ce qu'elles font
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 282
    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 282
    Points : 36 769
    Points
    36 769
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sachant que n'importe qui peut accéder aux attributs d'un objet, je me pose la question suivante : faut-il faire des getters et setters ou accéder directement aux champs ?
    Je ne comprends pas.

    Avec "setter/getter", l'idée est que des méthodes .setName(value) ou .getName() correspondent (ou pas) à un (prétendu) attribut Name de l'objet.
    Mais en fait, la méthode fait ce qu'elle veut et l'appelant n'est pas supposé en connaître "l'implémentation" pourvu que le boulot soit "fait".

    L'intérêt est qu'on pourra "plus tard" changer l'implémentation alors qu'avec un accès direct aux attributs changer sera plus difficile.
    Enfin çà c'est pour les langages Java/C++.

    Python a une autre approche: les descripteurs.
    Elle permet de définir l'attribut comme "interface" utilisable par l'appelant et d'activer une fonction si nécessaire "plus" tard _sans avoir à changer l'interface_.

    Reprenons:
    Sachant que n'importe qui peut accéder aux attributs d'un objet, je me pose la question suivante : faut-il faire des getters et setters ou accéder directement aux champs ? Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Frame:
        def __init__(self, rawdata=""):
            self.rawdata = rawdata
    Soit l'attribut .rawdata fait partie de l'interface, soit il n'en fait pas partie et cela peut être indiqué par ._rawdata.

    Si l'attribut .rawdata fait partie de l'interface, son "comportement" pourra être modifié _plus tard_ et si nécessaire via @property
    Mais le code que ci dessous n'a pas grande utilité sinon "montrer" une utilisation de "property".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Frame:
        def __init__(self, rawdata=""):
            self._rawdata = rawdata
        @property
        def rawdata(self):
             #pour faire plus que ci dessous, sinon çà ne sert pas à grand chose 
             return self._rawdata
        @rawdata.setter
        def rawdata(self, value): 
             #idem 
             self._rawdata = value
    J'ai lu qu'on pouvait faire des mécanismes de protection avec property(), comme expliqué par Thierry Chapuis :
    Python étant interprété, on crée une indirection sans changer l'interface, mais rien n'empêche d'accéder à la variable "cachée derrière".



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

  5. #5
    Membre éprouvé

    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
    Points : 1 273
    Points
    1 273
    Par défaut
    Comme ZZelle et pacificator, j’utilise getter/setter/eraser quand je veux appliquer un pré- ou post-traitement aux données, sinon je fais confiance au programmeur (moi, en général… ).

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pacificator
    La philosophie de python est de croire que les programmeurs sont des personnes responsables, qui savent ce qu'elles font
    C'est bien ce qu'il m'avait semblé, et j'avoue que c'est ainsi que j'ai procédé.

    Citation Envoyé par ZZelle
    Personnellement, j'utilise majoritairement les property getter pour des informations que je veux calculer de manière fainéante ou qui sont un agrégat d'autres attributs de classes. Et les property setter pour faire des checks lors d'un set.
    Je vais retenir cette idée !

    Citation Envoyé par mont29
    Comme ZZelle et pacificator,
    Tout le monde est d'accord ^^


    Citation Envoyé par wiztricks
    Je ne comprends pas.
    C'était juste une question équivalente à "quelle est la pratique adopter?" et non à "est-ce possible?".
    Citation Envoyé par wiztricks
    Enfin çà c'est pour les langages Java/C++.
    Oui oui, tout à fait d'accord
    Citation Envoyé par wiztricks
    Si l'attribut .rawdata fait partie de l'interface, son "comportement" pourra être modifié _plus tard_ et si nécessaire via @property
    Concrètement, je ne crée pas de getter / setter "explicites" (de "vraies" fonctions) et je laisse les utilisateurs de la classe accéder aux variables. Si par la suite je souhaite modifier le fonctionnement de cet attribut, alors j'utilise le mécanisme des @property et @attr.setter. Ce sera transparent pour les utilisateurs de la classe qui n'auront pas à modifier leur code. C'est bien ça ?

    Quelle différence fondamentale entre @property /@attr.setter avec x = properpy(getx, setx) ?


    Merci à tous pour vos réponses !

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 282
    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 282
    Points : 36 769
    Points
    36 769
    Par défaut
    Salut,
    Quelle différence fondamentale entre @property /@attr.setter avec x = properpy(getx, setx) ?
    Juste différentes "formes" utilisable pour réaliser la même chose.

    Concrètement, je ne crée pas de getter / setter "explicites" (de "vraies" fonctions) et je laisse les utilisateurs de la classe accéder aux variables.

    Si par la suite je souhaite modifier le fonctionnement de cet attribut, alors j'utilise le mécanisme des @property et @attr.setter. Ce sera transparent pour les utilisateurs de la classe qui n'auront pas à modifier leur code. C'est bien ça ?
    Yup.
    En Java si l'attribut fait partie de l'interface, vous ne pourrez pas le changer en fonction "setter/getter" _plus tard_ sans changer l'interface ce qui peut être gênant...
    En Python vous pourrez faire évoluer le comportement de l'interface plus tard, si nécessaire. Du coup, inutile de blinder le code pour un truc qui n'arrivera peut être jamais...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'aime bien le principe

    Je place le sujet comme .

    Encore merci !

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

Discussions similaires

  1. [VB.NET] Génération automatique Property (getter / setter)
    Par Husqvarna dans le forum Windows Forms
    Réponses: 7
    Dernier message: 23/07/2020, 11h55
  2. [POO] Pourquoi recourir aux Getters/Setters ?
    Par Wormus dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 18/01/2008, 18h38
  3. [NetBeans] generation automatique getters/setters
    Par kenito dans le forum NetBeans
    Réponses: 1
    Dernier message: 12/05/2006, 14h37
  4. [Info]générer automatiquement les getters / setters
    Par lr dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/02/2005, 10h14
  5. configuration getter & setter
    Par otb82 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 15/10/2003, 15h53

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