Ich weiß, dass die Attribute der Klasse, die mit dem doppelten Unterstrich __
Präfix deklariert sind, auch außerhalb der Klassendefinition sichtbar sein können. Da wir immer noch auf diese Attribute von object._className__attrName
zugreifen können.
Um nun alle Attribute außer dem Attribut catch
zu schützen, muss ich sie mit doppeltem Unterstrich deklarieren, was ziemlich unordentlich ist. Kann ich in meiner Klassendefinition sagen, dass nur auf self.catch
außerhalb der Klasse zugegriffen werden kann?
Entschuldigung, falls das irgendwo anders beantwortet oder besprochen wird.
Ja, es ist möglich, private Daten in einem Closure zu verstecken - zumindest, wenn es eine Möglichkeit gibt, auf private
von außerhalb von make_A
zuzugreifen, habe ich es nicht gefunden:
Beachten Sie, dass private
nicht in dir(a)
Obwohl dies möglich ist, halte ich das nicht für eine empfehlenswerte Methode in Python zu programmieren.
Oben wird private
von allen Instanzen von A
geteilt. Um private Daten pro Instanz zu verwenden, fügen Sie self
zum dict key hinzu:
Während die akzeptierte Antwort von unutbu
eine gute Idee zum Ausblenden von Daten darstellt, ist das private
-Wörterbuch weiterhin mit __closure__
verfügbar (dieses Attribut kann nicht entfernt werden):
Oder folgen Sie dem Link von Sumukh Barve
in den Kommentaren:
Die einzige Möglichkeit zum Erstellen von private
Attributen besteht darin, eine Art CPython
Erweiterung zu schreiben.
Nein, da es Teil des Namens ist, können Sie das nicht tun.
Nun, eigentlich kannst du das mit den Gettern / Settern hacken, aber das solltest du generell nicht tun.
Warum möchten Sie vielleicht Attribute schützen?
Wenn Sie Attribute vor unbeabsichtigtem Überschreiben schützen möchten, verwenden Sie doppelte Unterstriche und wahrscheinlich nur Ready-Only-Eigenschaften, um den Zugriff zu erleichtern. Aber die meiste Zeit, du wirst es nicht brauchen . Tun Sie sich selbst einen Gefallen und lassen Sie die Attribute offen, dies erleichtert das Debuggen erheblich.
Wenn Sie Ihr Objekt vor Manipulationen durch Dritte schützen möchten, können Sie mit __getattr__
und __setattr__
spielen, aber wahrscheinlich sollten Sie keine nicht vertrauenswürdigen Client-Objekte mit geschützten Daten übergeben. Verwenden Sie dazu die Fassadenmuster und verstecken Ihre Wertsachen undurchsichtiger. Vielleicht möchten Sie auch Ihre Architektur überdenken.
Tags und Links python