87 votes

Utilisez-vous le modèle get/set (en Python) ?

L'utilisation de get/set semble être une pratique courante en Java (pour diverses raisons), mais je vois rarement du code Python qui l'utilise.

Pourquoi utiliser ou éviter les méthodes get/set en Python ?

0 votes

De bonnes réponses de la part de tout le monde. Certes, cette question est une émanation de celle-ci stackoverflow.com/questions/1022970/ Cependant, il semble que j'ai été assailli par une horde de personnes qui l'ont considéré sous l'angle du mot "J". Merci encore de m'avoir redonné foi en la raison...

1 votes

Le contexte est important, et ici Python et Java sont simplement différents. (Cependant, j'ai supprimé Python du titre parce que nous utilisons des balises pour cela sur SO ;)

0 votes

117voto

blokeley Points 1543

En python, vous pouvez accéder directement à l'attribut car il est public :

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

Si vous voulez agir sur l'accès ou la mutation de l'attribut, vous pouvez utiliser propriétés :

class MyClass:

    def __init__(self):
        self._my_attribute = 0

    @property
    def my_attribute(self):
        # Do something if you want
        return self._my_attribute

    @my_attribute.setter
    def my_attribute(self, value):
        # Do something if you want
        self._my_attribute = value

Il est essentiel que le code client reste le même.

60voto

mgv Points 4250

Lien sympa : Python n'est pas Java :)

En Java, vous devez utiliser des getters et des setters parce que l'utilisation de champs publics ne vous donne pas la possibilité de revenir en arrière et de changer d'avis plus tard pour utiliser des getters et des setters. En Java, il est donc préférable de s'acquitter de cette tâche dès le départ. En Python, c'est idiot, car on peut commencer avec un attribut normal et changer d'avis à tout moment, sans que cela n'affecte aucun client de la classe. N'écrivez donc pas de getters et de setters.

3 votes

De plus, les setters/getters ajoutent un coût de performance, en particulier en Python.

4 votes

Le présent fait imposent une charge supplémentaire au concepteur de la classe, dans la mesure où les variables d'instance font implicitement partie de l'API publique de la classe. Lorsque vous créez une classe, réfléchissez explicitement aux variables d'instance auxquelles vous souhaitez avoir accès de manière externe par rapport à celles qui font simplement partie de l'implémentation de votre classe. Préfixez les variables d'implémentation internes par un "_". C'est le signe d'avertissement de Python qui indique que si l'implémentation change, cette variable peut changer aussi ou même disparaître complètement. Dans le cas contraire, la connaissance de l'implémentation s'échappera de votre classe, ce qui la rendra difficile à modifier ultérieurement.

9 votes

@Nick D : Je ne pense pas que les accesseurs soient le bon endroit pour optimiser la vitesse en Python.

31voto

Nick Dandoulakis Points 26809

Voici ce que dit Guido van Rossum à ce sujet dans l'article suivant Les maîtres de la programmation

Qu'entendez-vous par "lutter contre la langue" ?

Guido : Cela signifie généralement qu'ils sont essayent de poursuivre leurs habitudes qui qui fonctionnaient bien dans une autre langue.

[...] Les gens transformeront tout en une classe, et transformeront chaque accès en une méthode d'accès,
alors que ce n'est vraiment pas une chose judicieuse à faire en Python ; vous aurez un code plus verbeux qui est
plus difficile à déboguer et fonctionne beaucoup plus lentement. Vous connaissez l'expression "On peut écrire FORTRAN dans n'importe quel langage ?" Vous pouvez également écrire Java dans n'importe quel langage.

16voto

Max Shawabkeh Points 19030

Non, ce n'est pas pythonique. La méthode généralement acceptée consiste à utiliser des attributs de données normaux et à remplacer par des propriétés ceux qui nécessitent une logique get/set plus complexe.

13 votes

+1 : "Nous sommes tous des adultes ici". Le code est visible. Les termes "private" et "getter/setter" ne créent aucune valeur lorsque tout le code est visible.

7voto

Shane C. Mason Points 4074

La réponse courte à votre question est non, vous devez utiliser les propriétés lorsque c'est nécessaire. Ryan Tamyoko donne la réponse longue dans son article Getters/Setters/Fuxors

La valeur fondamentale à retenir de tout cela est qu'il faut s'efforcer de faire en sorte que chaque ligne de code ait une valeur ou une signification pour le programmeur. Les langages de programmation sont destinés aux humains, pas aux machines. Si vous avez du code qui semble ne rien faire d'utile, qui est difficile à lire ou qui semble fastidieux, alors il y a de fortes chances que Python dispose d'une fonctionnalité du langage qui vous permettra de le supprimer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X