Question

En utilisant get / set semble être une pratique courante en Java (pour diverses raisons), mais je vois à peine le code Python qui utilise.

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

Était-ce utile?

La solution

lien Cool: Python est pas Java :)

  

En Java, vous devez utiliser des accesseurs, car l'utilisation des champs publics vous donne pas la possibilité de revenir en arrière et changer d'avis plus tard à l'aide des accesseurs. Donc, en Java, vous pourriez aussi bien obtenir la corvée de la route à l'avant. En Python, cela est stupide, parce que vous pouvez commencer avec un attribut normal et changer d'avis à tout moment, sans affecter les clients de la classe. Donc, ne pas écrire accesseurs.

Autres conseils

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

Fondamentalement, le code client reste le même.

Voici ce que Guido van Rossum dit à ce sujet dans Masterminds de programmation

  

Que voulez-vous dire par "la lutte contre la langue"?

     

Guido: Cela signifie généralement qu'ils sont   en essayant de poursuivre leurs habitudes   a bien fonctionné avec une autre langue.

     

[...] Les gens vont tourner tout en   une classe, et transformer chaque accès en un   accesseur,
  où c'est vraiment pas une chose à faire en Python;   vous aurez un code plus détaillé qui est
  plus difficile à déboguer et fonctionne beaucoup plus lent.   Vous connaissez l'expression « Vous pouvez écrire   FORTRAN dans toutes les langues? » Vous pouvez écrire Java dans toutes les langues, aussi.

Non, c'est unpythonic. La façon généralement acceptée est d'utiliser l'attribut de données normal et remplacer ceux qui ont besoin deviennent plus complexes / logique mis en propriétés.

La réponse à votre question est non, vous devez utiliser les propriétés en cas de besoin. Ryan Tamyoko fournit la réponse longue dans son article Getters / Setters / Fuxors

  

La valeur de base à emporter de tout cela est que vous voulez nous efforcer de faire en sorte que chaque ligne de code a une certaine valeur ou signification pour le programmeur. Les langages de programmation sont pour les humains, pas des machines. Si vous avez du code qui ressemble à ça ne fait rien d'utile, est difficile à lire, ou semble fastidieux, alors les chances sont bonnes que Python a une fonctionnalité de langage qui vous permettra de le supprimer.

Votre observation est correcte. Ce n'est pas un style normal de programmation Python. Les attributs sont publics, donc vous venez de l'accès (get, set, supprimer) comme vous le feriez avec des attributs de tout objet qui les a (pas seulement les classes ou instances). Il est facile de dire quand les programmeurs Java apprendre Python parce que leur code Python ressemble à Java en utilisant la syntaxe Python!

Je suis certainement d'accord avec tous les commentaires précédents, en particulier @ lien de Maximiliano à l'article célèbre de Phillip et @ suggestion de Max que quelque chose de plus complexe que la manière standard de réglage (et obtenir) des attributs de classe et l'instance est à utiliser les propriétés (ou Descripteurs de 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 privé, protégé, ami, ou quelle que soit la politique que vous voulez si vous désirez autre chose que du public.)

En tant que démonstration intéressante, dans base Python Programmation (chapitre 13, article 13.16) , je suis venu avec un exemple d'utilisation de descripteurs pour stocker des attributs sur le disque au lieu de la mémoire !! Oui, il est une forme étrange de stockage persistant, mais fait vous montrer un exemple de ce qui est possible!

Voici un autre poste connexe qui pourraient vous être utiles aussi bien: python: plusieurs propriétés, un setter / getter

J'étais venu ici pour cette réponse (malheureusement je ne pouvais pas). Mais j'ai trouvé un travail autour ailleurs. Ce code pourrait être ci-dessous alternative pour 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 . En utilisant le concept ci-dessus u pourrait facilement construire obtenir / méthodologie définie dans py aussi.

Notre professeur a montré un exemple sur la classe expliquant alors que nous devrions utiliser les fonctions accesseur.

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top