python: unveränderliche private Klassenvariablen?

7

Gibt es eine Möglichkeit, diesen Java-Code in Python zu übersetzen?

%Vor%

z.B. thingies ist eine unveränderliche private Liste von Thingy -Objekten, die der Klasse Foo und nicht ihrer Instanz angehört.

Ich kann statische Klassenvariablen aus dieser Frage definieren Statische Klassenvariablen in Python aber ich weiß nicht, wie ich sie unveränderlich und privat machen soll.

    
Jason S 13.09.2011, 18:52
quelle

4 Antworten

8

Sie können keines dieser Dinge in Python tun, jedenfalls nicht in dem Sinne, wie Sie es in Java tun.

Per Konvention werden Namen, denen ein Unterstrich vorangestellt ist, als privat betrachtet und sollten nicht außerhalb der Implementierung aufgerufen werden, aber in Python erzwingt nichts diese Konvention. Es handelt sich eher um eine Warnung, dass Sie sich mit einem Implementierungsdetail herumschlagen, das sich ohne Warnung in einer zukünftigen Version des Codes ändern kann.

    
kindall 13.09.2011, 18:54
quelle
14

In Python besteht die Konvention darin, ein _ Präfix für Attributnamen zu verwenden, um protected und ein __ Präfix für private zu bedeuten. Dies wird nicht durch die Sprache erzwungen; Von Programmierern wird erwartet, dass sie keinen Code schreiben, der auf Daten basiert, die nicht öffentlich sind.

Wenn Sie die Unveränderbarkeit wirklich durchsetzen möchten, können Sie eine Metaklasse [ docs ] (die Klasse einer Klasse). Ändere einfach __setattr__ und __delattr__ , um Ausnahmen auszulösen, wenn jemand versucht, sie zu modifizieren, und mache es zu einem tuple (eine unveränderbare Liste) [ Dokumente ] .

%Vor%

Beispiele

%Vor% %Vor%

Es wäre technisch immer noch möglich, diese zu modifizieren, indem Sie die internen .__dict__ der Attribute der Klasse durchlaufen, aber dies sollte ausreichen, um die meisten Benutzer davon abzuhalten, es ist sehr schwierig, Python-Objekte vollständig zu sichern.

    
Jeremy Banks 13.09.2011 19:07
quelle
5

Sie können es unschreibbar machen (subtil anders als unveränderlich), indem Sie Eigenschaften verwenden, aber es gibt keine Möglichkeit, es privat zu machen - das widerspricht Pythons Philosophie.

%Vor%

Ob es unveränderlich ist oder nicht, hängt davon ab, was Sie zurückgeben; Wenn Sie ein veränderbares Objekt zurückgeben, können Sie möglicherweise mutieren, dass und diese Änderungen in der Instanz / Klasse anzeigen.

%Vor%

Damit können Sie thingies mutieren, und da das zurückgegebene Objekt das gleiche Objekt ist, das in der Instanz / Klasse enthalten ist, werden die Änderungen beim nachfolgenden Zugriff widergespiegelt.

Vergleichen Sie das mit:

%Vor%

Da jedes Mal eine brandneue Liste zurückgegeben wird, spiegeln sich Änderungen daran nicht in nachfolgenden Zugriffen wider.

    
Ethan Furman 13.09.2011 19:02
quelle
1

Sie möchten in die Funktion property() schauen. Sie können Ihren eigenen benutzerdefinierten Getter und Setter für ein Mitgliedsattribut einer Klasse definieren. Es könnte in etwa so aussehen:

%Vor%

Ich habe es nicht genug benutzt, um sicher zu sein, ob es benutzt werden kann, um etwas "Privates" zu kreieren, also müsstest du selbst eintauchen, aber isinstance kann helfen.

    
g.d.d.c 13.09.2011 19:01
quelle

Tags und Links