Python attribut est en lecture seule à l'intérieur de la classe
J'ai une classe:
class Portfolio:
def __init__(self, value):
self.value = value
class GenericStrategy:
def __init__(self, portfolio: Portfolio):
self.portfolio = portfolio
def modify_ptf_value(new_value):
self.portfolio.value = new_value
# This should return an error
Je'va écrire certaines des stratégies qui va hériter de GenericStrategy
. J'aimerais leurs méthodes pour être en mesure de lire l'attribut portefeuille, mais de ne pas le modifier, ni ses attributs.
J'ai lu quelque chose à propos de la @properties
décorateur, mais il ne fonctionne que si je ne veux pas l'attribut (et ses attributs) pour être accessible de l'extérieur, je peux toujours modifier l'attribut (et ses attributs) à partir de méthodes 'à l'intérieur de l'objet.
Est-il un moyen de faire de l'attribut (et ses attributs) 'lecture seule' l'exception de la __init__
méthode? Ma conception erronée et doit recommencer depuis le début? Je sais que c'est à l'utilisateur de ne pas modifier "protégés" attributs, mais je tiens à faire preuve de balle. Toute idée est bien acceptée, même si elle nécessite un changement considérable dans la conception de classe.
Grâce
Vous devez vous connecter pour publier un commentaire.
Contrairement à d'autres (couramment utilisé) langages de programmation Python est livré avec une nouvelle approche concernant l'accès de la classe/les membres de l'instance. Par exemple, rien n'est vraiment privé, les champs/méthodes:
_
, sont régulièrement champs__
(et à la fin avec tout au plus un_
), sont juste le nom mutilé, mais ils peuvent toujours être consulté (même modifiés/supprimés) à partir de l'extérieur de la classeAinsi, à la fin, c'est une question de convention, et il compte qu'il sera suivi par ceux qui ont écrit le code. Ligne de fond est qu'il y a rien qui permettrait d'empêcher un utilisateur d'accéder à une classe/instance-même.
Note: Dans d'autres langues il est aussi possible pour accéder aux membres privés: il existe des méthodes officiellement pris en charge (comme Réflexion ([Oracle]: Trail: L'API Reflection) pour Java), ou pas officiellement pris en charge (qui nécessitent quelques "trucs et astuces" - par exemple:
reinterpret_cast
ing unclass
à unstruct
avec la même structure pour C++). De nos jours, de plus en plus de langues ont tendance à offrir un moyen de modifier une instance de la structure.De toute façon, il y a le soi-disant Descripteur de Protocole ([Python]: Descripteur De Guide) qui est l'un des Python's le plus puissant (et le plus mal compris) caractéristiques.
À l'aide de descripteurs (comme un commentaire, propriétés compter sur eux), j'ai écrit un bout de code qui permet (dans une certaine mesure) de ce que vous me demandez:
Notes:
__
de l'attribut privé de son nom, (portfolio
) pour éviter d'utiliser les mutilations dont je parlais, dans mon code (il serait plus difficile à lire)object
. Si la compatibilité n'est pas obligatoire, l'héritage de la relation peut être supprimé (dans Py3x il est par défaut)try/except
blocs pour illustrer le comportement, dans production ils doivent être supprimésportfolio
type d'objets utilisationLockedAttribute
ainsi, et de les faire en lecture seule (ou les initialiser dansGenericStrategy.__init__
- qui casserait toute agrégation), mais je doute que cela pourrait convenir à vos besoins.__setattr__
méthode, vous pourriez peut-être quelque chose à partir de là pour vous rapprocher de votre objectif.