Si la classe créée a une propriété de type «dict» et que vous ne voulez pas que l'utilisateur modifie l'élément de propriété sans autorisation, nous expliquerons comment utiliser MappingProxyType pour empêcher la modification de l'élément de propriété.
Par exemple, supposons le code suivant.
python
class Foo:
def __init__(self):
self._bar = {'a': 1, 'b': 2}
@property
def bar(self):
return self._bar
def add_item(self, key, value):
#Je souhaite que les utilisateurs ajoutent des éléments uniquement via cette méthode
self._bar[key] = value
Dans ce code, la propriété de classe Foo bar
n'a pas de setter
défini, donc l'utilisateur ne peut pas changer bar
en un autre objet. Tenter de définir une valeur différente pour bar
entraînera une erreur, comme indiqué ci-dessous.
python
>>> foo = Foo()
>>> foo.bar
{'b': 2, 'a': 1}
>>> foo.bar = 1
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
foo.bar = 1
AttributeError: can't set attribute
Cependant, puisque foo.bar
lui-même est un dict, vous pouvez ajouter des éléments.
python
>>> foo.bar['c'] = 3
>>> foo.bar
{'b': 2, 'a': 1, 'c': 3}
Afin d'éviter les modifications involontaires du créateur d'une telle classe, il existe un moyen d'utiliser le type MappingProxyType
de la bibliothèque types
dans Python Ver 3.3 ou version ultérieure. Si vous utilisez le constructeur MappingProxyType et renvoyez le dictionnaire renvoyé en tant qu'objet proxy de mappage, l'utilisateur ne pourra pas modifier l'objet renvoyé. Si vous modifiez l'échantillon plus tôt, il ressemblera à ceci.
python
from types import MappingProxyType
class Foo:
def __init__(self):
self._bar = {'a': 1, 'b': 2}
@property
def bar(self):
return MappingProxyType(self._bar)
def add_item(self, key, value):
self._bar[key] = value
Si l'utilisateur essaie d'ajouter un élément à la barre comme suit, une erreur se produit.
python
>>> foo = Foo()
>>> foo.bar
mappingproxy({'a': 1, 'b': 2})
>>> foo.bar['c'] = 3 #Tenter d'ajouter un élément entraînera une erreur.
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
foo.bar['c'] = 3
TypeError: 'mappingproxy' object does not support item assignment
>>> foo.add_item('c', 3) #L'utilisateur ajoute un élément à l'aide d'une méthode.
>>> foo.bar
mappingproxy({'a': 1, 'c': 3, 'b': 2})
«mappingproxy» peut être utilisé comme un dictionnaire «en lecture seule» car vous pouvez obtenir des éléments de la même manière que «dict».
Recommended Posts