[PYTHON] Um eine Diktat-Eigenschaft schreibgeschützt zu machen

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

Um eine Diktat-Eigenschaft schreibgeschützt zu machen
Wie erstelle ich eine japanisch-englische Übersetzung?
Wie man einen lockeren Bot macht
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
Python / Machen Sie ein Diktat aus einer Liste.
[Blender] So erstellen Sie ein Blender-Plug-In
Wie erstelle ich einen Crawler?
[Python] Wie man eine Klasse iterierbar macht
Ich habe eine Web-API erstellt
So erstellen Sie einen benutzerdefinierten Backtrader-Indikator
Wie erstelle ich eine Pelican Site Map?
Wie man ein Dialogsystem für Anfänger erstellt
Ein Memorandum, um WebDAV nur mit Nginx zu erstellen
Möchten Sie einen Twitter-Lebenslauf erstellen?
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
So erstellen Sie ein QGIS-Plug-In (Paketerzeugung)
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
Ich las "Wie man ein Hacking Lab macht"
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Lark grundlegende Erklärung (machen Sie einen Shell-ähnlichen Kerl mit Python, Lark)
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Wie man ein Schießspiel mit toio macht (Teil 1)
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
Erstellen Sie mit OpenCV eine Funktion zum Beschreiben japanischer Schriftarten
So erstellen Sie ein Python-Paket mit VS Code
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Anfänger des maschinellen Lernens versuchen, einen Entscheidungsbaum zu erstellen
Grundlagen von PyTorch (2) - Wie erstelle ich ein neuronales Netzwerk?
Konvertieren Sie den Webpay-Entitätstyp in den Dict-Typ (rekursiv in Python).
Machen Sie einen Funktionsdekorateur
Property Decorator verwenden?
Erstellen Sie eine Distanzmatrix
diktieren in diktieren Macht ein Diktat ein Diktat
Dikt in Array konvertieren
Ich mache ein Passwort!
Machen Sie einen Nyan-Knopf
Mach ein Spiel im Tetris-Stil!
Erstellen Sie einen Base64-Decoder
So erstellen Sie mit Flask einen BOT für Cisco Webex-Teams
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
Wie erstelle ich ein Multiplayer-Online-Actionspiel mit Slack?
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
So erstellen Sie ein Hacking-Labor - Kali Linux (2020.1) VirtualBox 64-Bit Teil 2-
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
So erstellen Sie ein Hacking-Labor - Kali Linux (2020.1) VirtualBox 64-Bit-Edition -
Kombinieren Sie Listen zu einem DataFrame mit Pandas
Wie man ein einfaches Flappy Bird-Spiel mit Pygame macht
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
[Einführung in Tensorflow] Verstehen Sie Tensorflow richtig und versuchen Sie, ein Modell zu erstellen
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Ich habe mit PyQt einen einfachen Texteditor erstellt