schreibgeschützte Python-Klasseneigenschaften

7

Gibt es eine Möglichkeit, schreibgeschützte Klasseneigenschaften in Python zu erstellen? Ex. In Unity3d können Sie dies tun:

%Vor%

Vector3.zero gibt eine Instanz der Vector3-Klasse zurück, wobei x, y und z 0 sind. Dies ist im Grunde dasselbe wie:

%Vor%

Ich habe versucht, so etwas zu tun:

%Vor%

Aber ich bekomme einen undefinierten Variablenfehler, weil die Klasse noch nicht definiert wurde. Also, wie machen Sie schreibgeschützte Klasseneigenschaften, die keine Instanz der Klasse erfordern?

    
topher 01.09.2011, 16:22
quelle

7 Antworten

9

Verwenden Sie eine Metaklasse

%Vor%     
eryksun 01.09.2011, 16:38
quelle
10

Der offensichtlichste Weg könnte sein, das Klassenobjekt nachträglich zu ändern:

%Vor%

Das Hauptproblem dabei ist, dass es dann nur noch ein Objekt von Null gibt, und wenn es veränderbar ist, können Sie überall Unfallschäden verursachen. Es kann einfacher (und weniger hacky) sein, einen dynamischen Deskriptor zu verwenden, der jedes Mal, wenn auf ihn zugegriffen wird, einen Nullvektor erzeugt (dies geschieht durch Erstellen eines ClassProperty Klasse):

%Vor%

Ich halte jedoch keines davon für wirklich "pythonisch". Betrachten Sie die anderen mathematischen Typen in Python: Ints, Floats und komplexe Zahlen. Keiner von diesen hat ein "Null" -Klassenattribut oder einen Zero-Konstruktor, stattdessen geben sie null zurück, wenn sie ohne Argumente aufgerufen werden. Vielleicht sollte es also am besten sein:

%Vor%

Dies ist weniger wie Unity3D und eher wie Python, wenn Sie wissen, was ich meine.

    
Devin Jeanpierre 01.09.2011 16:26
quelle
5

Verwenden Sie einen Deskriptor :

%Vor%

Sollte tun, was Sie wollen:

%Vor%     
cnelson 01.09.2011 17:34
quelle
2

Was Sie sich vorstellen, ist möglich, aber in diesem Fall nicht notwendig. Warte einfach, bis deine Klasse das Attribut

zugewiesen hat %Vor%

oder machen Sie es zu einer Modul-Level-Konstante.

Es besteht eine gute Chance, dass Sie einfach ein Formular (3,) numpy Array verwenden, anstatt diese Klasse zu schreiben, für irgendwelche praktischen Zwecke.

    
Mike Graham 01.09.2011 16:25
quelle
1

Das ist eine wirklich interessante Frage, die Problemumgehung, mit der ich fortfahren würde, ist eine Klassenmethode als "Getter" für das Null-Objekt zu machen:

%Vor%     
Adam Parkin 01.09.2011 16:39
quelle
0
%Vor%

Schamlos gestohlen von hier

    
neurino 01.09.2011 16:57
quelle
-1

Was den schreibgeschützten Teil betrifft, ist dies eine gute Ressource.

> %Vor%     
Nick ODell 01.09.2011 16:31
quelle

Tags und Links