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 ?
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 ?
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.
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.
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.
@Nick D : Je ne pense pas que les accesseurs soient le bon endroit pour optimiser la vitesse en Python.
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.
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 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.
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
En rapport : Quelle est la façon pythonique d'utiliser les getters et setters ?