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.
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.
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 __setattr__
und __delattr__
, um Ausnahmen auszulösen, wenn jemand versucht, sie zu modifizieren, und mache es zu einem tuple
(eine unveränderbare Liste) [ Dokumente ] .
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.
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.
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:
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.