Quelle est la pythonic façon d'utiliser les accesseurs et mutateurs?
Je fais comme:
def set_property(property,value):
def get_property(property):
ou
object.property = value
value = object.property
Je suis nouveau sur Python, donc je suis encore à explorer la syntaxe, et j'aimerais avoir quelques conseils sur la façon de procéder.
- L'on a accepté la réponse ne résout pas le problème. Je recommande Grissiom réponse pour plus de détail sur la solution.
- Non, je pense que vous avez voulu dire que Aaron Hall de la réponse c'est le seul à lire.
Vous devez vous connecter pour publier un commentaire.
Essayez ceci: Python Propriété
L'exemple de code est:
La "Pythonic" moyen est pas à utiliser des "getters" et des "poseurs", mais utiliser simplement les attributs, tels que la question démontre, et
del
de déréférencement (mais les noms sont changés pour protéger les innocents... les builtins):Si plus tard, vous souhaitez modifier le paramètre et d'obtenir, vous pouvez le faire sans avoir à modifier le code de l'utilisateur, à l'aide de la
property
décorateur:(Décorateur, des copies et des mises à jour de l'état de la propriété de l'objet, donc, la note que vous devriez probablement utiliser le même nom pour chaque ensemble, obtenir et de supprimer la fonction/méthode.)
Après la définition ci-dessus, le réglage d'origine, et de la suppression est la même:
Vous devriez éviter cela:
Tout d'abord, le ci-dessus ne fonctionne pas, parce que vous ne fournissez pas un argument pour l'instance que la propriété pourrait être fixée (généralement
self
), qui serait:Deuxièmement, cela duplique l'objet de deux méthodes spéciales,
__setattr__
et__getattr__
.Troisièmement, nous avons aussi la
setattr
etgetattr
fonctions internes.La
@property
décorateur pour créer des accesseurs et mutateurs.Par exemple, nous pourrions modifier le comportement du paramètre d'imposer des restrictions à la valeur définie:
En général, nous voulons éviter d'utiliser
property
et il suffit d'utiliser directement les attributs.C'est ce qui est attendu par les utilisateurs de Python. Suivant la règle de moindre surprise, vous devriez essayer de donner aux utilisateurs ce qu'ils attendent à moins d'avoir un très convaincante du contraire.
Démonstration
Par exemple, disons que nous avons besoin de notre objet attribut protégé pour être un entier compris entre 0 et 100 inclus, et d'empêcher sa suppression, avec les messages appropriés pour informer l'utilisateur de son utilisation correcte:
Et utilisation:
Les noms de matière?
Oui ils ne.
.setter
et.deleter
faire des copies de l'original de la propriété. Cela permet à les sous-classes pour bien modifier le comportement sans en altérer le comportement de la mère.Maintenant pour que cela fonctionne, vous devez utiliser les noms respectifs:
Je ne suis pas sûr de l'endroit où ce serait utile, mais les cas d'utilisation est si vous voulez un get, set, et/ou de supprimer seule propriété. Probablement préférable de s'en tenir à la sémantique même de la propriété portant le même nom.
Conclusion
Commencer avec de simples attributs.
Si plus tard vous avez besoin de fonctionnalités autour de la mise en, arriver, et la suppression, vous pouvez l'ajouter avec la propriété décorateur.
Éviter des fonctions nommé
set_...
etget_...
- c'est ce que les propriétés sont pour.__init__
méthode se réfère àself.protected_value
mais les accesseurs et des mutateurs reportez-vous àself._protected_value
. Pourriez-vous expliquer comment cela fonctionne? J'ai testé ton code et il fonctionne comme est - donc ce n'est pas une faute de frappe.__init__
serait-il?self.protected_value = start_protected_value
est en fait l'appel de la fonction de définition; j'ai pensé que c'était une mission.self.protected_value = start_protected_value
n'est pas une affectation, mais un appel de fonction.property
décorateur utilise le descripteur de protocole, de gérer le contrat de recherche. J'ai une réponse qui décrit la façon dont ils travaillent ici: stackoverflow.com/a/34554353/541136Découvrez la
@property
décorateur.À l'aide de
@property
et@attribute.setter
vous permet non seulement d'utiliser les "pythonic" mais également de vérifier la validité des attributs à la fois lors de la création de l'objet et lorsque l'altérer.Par la présente, vous vous "cacher"
_name
attribut de client développeurs et également effectuer des vérifications sur le nom de la propriété type. Notez qu'en suivant cette approche, même lors de l'initiation de l'accesseur est appelée. Donc:Conduira à:
Mais:
Vous pouvez utiliser les accesseurs/mutateurs (c'est à dire
@attr.setter
et@property
) ou pas, mais la chose la plus importante est pour être cohérent!PEP8, La conception de l'Héritage dit:
D'autre part, selon Google Guide de Style Python Les Règles De La Langue/Propriétés la recommandation est de:
Les avantages de cette approche:
et des inconvénients:
Vous pouvez utiliser les méthodes magiques
__getattribute__
et__setattr__
.Être conscient que
__getattr__
et__getattribute__
ne sont pas les mêmes.__getattr__
est invoqué lorsque l'attribut n'est pas trouvé.