Wenn die erstellte Klasse eine Eigenschaft vom Typ "dict" hat und der Benutzer das Element der Eigenschaft nicht ändern soll, können Sie mit MappingProxyType verhindern, dass das Element der Eigenschaft geändert wird.
Nehmen Sie beispielsweise den folgenden Code an.
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):
#Ich möchte, dass Benutzer Elemente nur über diese Methode hinzufügen
self._bar[key] = value
In diesem Code ist für die Foo-Klasseneigenschaft "bar" kein "Setter" definiert, sodass der Benutzer "bar" nicht in ein anderes Objekt ändern kann. Der Versuch, einen anderen Wert für "bar" festzulegen, führt zu einem Fehler, wie unten gezeigt.
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
Da jedoch "foo.bar" selbst ein Diktat ist, können Sie Elemente hinzufügen.
python
>>> foo.bar['c'] = 3
>>> foo.bar
{'b': 2, 'a': 1, 'c': 3}
Um unbeabsichtigte Änderungen des Erstellers einer solchen Klasse zu verhindern, gibt es eine Möglichkeit, den Typ "MappingProxyType" der Bibliothek "types" in Python Ver 3.3 oder höher zu verwenden. Wenn Sie den MappingProxyType-Konstruktor verwenden und das zurückgegebene Wörterbuch als Mapping-Proxy-Objekt zurückgeben, kann der Benutzer das zurückgegebene Objekt nicht ändern. Wenn Sie das Beispiel früher ändern, sieht es so aus.
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
Wenn der Benutzer wie folgt versucht, ein Element zur Leiste hinzuzufügen, tritt ein Fehler auf.
python
>>> foo = Foo()
>>> foo.bar
mappingproxy({'a': 1, 'b': 2})
>>> foo.bar['c'] = 3 #Der Versuch, ein Element hinzuzufügen, führt zu einem Fehler.
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) #Der Benutzer fügt ein Element mithilfe einer Methode hinzu.
>>> foo.bar
mappingproxy({'a': 1, 'c': 3, 'b': 2})
mapsproxy
kann als schreibgeschütztes Wörterbuch verwendet werden, da Sie Elemente auf die gleiche Weise wie
dict` erhalten können.
Recommended Posts