web-dev-qa-db-fra.com

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

Utiliser get/set semble être une pratique courante dans Java (pour diverses raisons), mais je ne vois presque pas Python qui l'utilise.

Pourquoi utilisez-vous ou évitez-vous les méthodes get/set en Python?

74
Avery Payne

Lien cool: Python n'est pas Java :)

En Java, vous devez utiliser des accesseurs et des installateurs, car l'utilisation de champs publics ne vous permet pas de revenir en arrière et de changer d'avis plus tard pour utiliser des accesseurs ou des installateurs. Donc, en Java, vous pourriez aussi bien vous occuper de la corvée. En Python, c'est idiot, car vous pouvez commencer avec un attribut normal et changer d'avis à tout moment, sans affecter les clients de la classe. Alors, n'écrivez pas de getters et de setters.

53
mgv

En python, vous pouvez simplement accéder à l'attribut directement 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 faire quelque chose 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

Surtout, le code client reste le même.

106
blokeley

Voici ce que dit Guido van Rossum à ce sujet dans Les concepteurs de la programmation

Qu'entendez-vous par "combattre la langue"?

Guido: Cela signifie généralement qu'ils essaient de conserver leurs habitudes qui ont bien fonctionné avec une langue différente.

[...] Les gens vont tout transformer en une classe, et transformer chaque accès en une méthode d'accesseur,
où ce n’est vraiment pas une bonne chose à faire en Python; vous aurez plus de code verbeux qui est
plus difficile à déboguer et fonctionne beaucoup plus lentement. Vous connaissez l'expression "Vous pouvez écrire le Fortran dans n'importe quelle langue?" Vous pouvez également écrire Java dans n’importe quel langage.

26
Nick Dandoulakis

Non, c'est non rythmique. La méthode généralement acceptée consiste à utiliser un attribut de données normal et à remplacer ceux qui nécessitent une logique plus complexe d’obtention/définition avec des propriétés.

14
Max Shawabkeh

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

La valeur fondamentale à retenir de tout cela est que vous voulez vous assurer que chaque ligne de code a une valeur ou une signification pour le programmeur. Les langages de programmation sont destinés aux humains, pas aux machines. Si votre code n'a pas l'air utile, est difficile à lire ou semble fastidieux, il y a de bonnes chances que Python possède une fonctionnalité de langage qui vous permettra de le supprimer.

6
Shane C. Mason

Votre observation est correcte. Ce n'est pas un style normal de programmation Python. Les attributs sont tous publics, vous devez donc y accéder (les obtenir, les définir, les supprimer) comme vous le feriez avec les attributs de tout objet les contenant (pas seulement les classes ou les instances). Il est facile de savoir quand les programmeurs Java apprennent Python parce que leur code Python ressemble à Java à l'aide de la syntaxe Python!

Je suis tout à fait d'accord avec toutes les affiches précédentes, en particulier le lien de @ Maximiliano avec le célèbre article de Phillip et de la suggestion de @ Max que rien de plus complexe que la méthode standard de réglage (et obtenir) les attributs de classe et d’instance consiste à utiliser les propriétés (ou des descripteurs pour en généraliser encore plus) pour personnaliser l’obtention et la définition des attributs! (Cela inclut la possibilité d'ajouter vos propres versions personnalisées de politique privée, protégée, d'amis ou de la politique de votre choix si vous désirez autre chose que public.)

Comme démonstration intéressante, dans Core Python Programming (chapitre 13, section 13.16), j’ai proposé un exemple d’utilisation de descripteurs pour stocker des attributs sur le disque plutôt que dans la mémoire! Oui, c'est une forme étrange de stockage persistant, mais il montre un exemple de ce qui est possible!

Voici un autre article connexe qui pourrait vous être utile: Python: plusieurs propriétés, un utilisateur/getter

5
wescpy

J'étais venu ici pour cette réponse (malheureusement, je ne pouvais pas). Mais j'ai trouvé un travail autour ailleurs où. Ce code ci-dessous pourrait être une alternative à get.
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
Ceci est juste un solution de contournement. En utilisant le concept ci-dessus, vous pourriez facilement construire une méthodologie get/set dans py également.

0
yunus