In Python möchte ich festlegen, dass ausgewählte Instanzattribute einer Klasse schreibgeschützt sind, um außerhalb der Klasse zu codieren. Ich möchte, dass es keinen Weg gibt, außerhalb dessen Code das Attribut verändern kann, außer indirekt durch das Aufrufen von Methoden für die Instanz. Ich möchte, dass die Syntax präzise ist. Was ist der beste Weg? (Ich gebe meine aktuelle beste Antwort unten ...)
Dies gibt aus:
$ python ./p.py
c.fullaccess = 0
c.fullaccess = 1234
c.readonly = 22
C.readonly kann nicht geändert werden
c.readonly = 22
c.readonly = 23
Meine Finger jucken, um
, d. h., einen Dekorator für ein Attribut verwenden. Es wäre so sauber ...
So geht's:
%Vor% (Angenommen, foobar
und blahblah
sind die Attribute, die schreibgeschützt sein sollen.) Wenn Sie einem Attributnamen zwei Unterstriche vorangestellt haben, werden diese von außerhalb der Klasse verborgen, also die internen Versionen wird von außen nicht zugänglich sein. Dieses funktioniert nur für Klassen im neuen Stil, die von Objekt erben, da es von property
abhängt.
Auf der anderen Seite ... das ist eine ziemlich dumme Sache zu tun. Variablen privat zu halten, scheint eine Obsession zu sein, die von C ++ und Java kommt. Ihre Benutzer sollten die öffentliche Schnittstelle zu Ihrer Klasse verwenden, da sie gut entworfen ist, nicht weil Sie sie dazu zwingen.
Bearbeiten: Sieht so aus, als hätte Kevin bereits eine ähnliche Version gepostet.
Es gibt keinen wirklichen Weg, dies zu tun. Es gibt Wege, es "schwieriger" zu machen, aber es gibt kein Konzept vollständig versteckter, nicht zugreifbarer Klassenattribute.
Wenn der Person, die Ihre Klasse verwendet, nicht vertraut werden kann, den API-Dokumenten zu folgen, dann ist das ihr eigenes Problem. Die Menschen davor zu schützen, dumme Sachen zu machen, bedeutet nur, dass sie viel komplizierter, komplizierter und schädlicher dummes Zeug tun werden, um zu versuchen, was immer sie nicht tun sollten.
Sie können eine Metaklasse verwenden, die Methoden (oder Klassenattribute), die einer Namenskonvention folgen, automatisch in Eigenschaften umwandelt (die schamlos aus Vereinheitlichung von Typen und Klassen in Python 2.2 :
%Vor%Damit können Sie:
verwenden %Vor%Tags und Links python attributes readonly