Was ist der einfachste und prägnanteste Weg, ausgewählte Attribute in einer Instanz schreibgeschützt zu machen?

8

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 ...)

    
Kevin Little 24.09.2008, 02:15
quelle

6 Antworten

7

Sie sollten den @property Dekorator verwenden.

%Vor%     
William Keller 24.09.2008, 02:22
quelle
2
%Vor%

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

sagen zu können %Vor%

, d. h., einen Dekorator für ein Attribut verwenden. Es wäre so sauber ...

    
Kevin Little 24.09.2008 02:21
quelle
2

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.

    
Dan Lenski 24.09.2008 06:49
quelle
1

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.

    
Dan Udey 24.09.2008 02:20
quelle
0

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%     
Ryan 24.09.2008 02:49
quelle
0

Ich bin mir bewusst, dass William Keller bei weitem die sauberste Lösung ist. Aber hier ist etwas, was ich gefunden habe.

%Vor%

Und hier ist das Anwendungsbeispiel

%Vor%

Leider kann diese Lösung keine privaten Variablen (__ benannte Variablen) verarbeiten.

    
Ivan 24.04.2010 11:37
quelle

Tags und Links