Properties
Verfasst: Montag 5. Januar 2015, 18:05
Ich habe mir die Info zu Properties bei Weigend (4. Aufl.) 2010, S. 275-276 durchgelesen, ohne sein Beispiel aus dem Buch zum Laufen zu bekommen. Ich habe jetzt mal ein Beispiel aus dem Netz gefunden. Aktuell habe ich drei Fragen:
1.) Im Kern habe ich eine Klasse, die Daten verarbeitet und mir bereitstellt, so dass ich über die Eigenschaften auf die einzelnen Werte zugreifen kann, was sehr komfortabel ist. Problem ist jetzt, dass ich manchmal nicht alle Daten brauche, d. h. die Klasse ackert enorm, um alle Daten verfügbar zu machen, abfragen will ich aber dann vielleicht nur 2, 3 Attribute. Ich habe mir jetzt überlegt, dass ich es gern so hätte, dass der Basisdatensatz immer bereitgestellt wird und der Rest nur, wenn ich ihn überhaupt explizit abfrage. Mir scheinen die Properties da geeignet, weil ich dann innerhalb der Klasse sagen kann, dass das Tool aus dem Datensatz noch Sachen nachladen soll. Gute Idee oder gibt es einen besseren Ansatz bei solchen Problemen???
2.) Muss ich die Eigenschaften auf unsichtbar stellen, um Properties zu nutzen (so bei Test und es läuft, also privates Attribut __x statt x). Ich versuche zu verstehen, warum das 2. Beispiel Fehler produziert, das erste Beispiel demgegenüber läuft. (Ich habe die Variablen angepasst, um die genaue Fehlerquelle zu finden.)
3.) Ich habe mir bislang angewöhnt, dass ich alle Eigenschaften einer Klasse vor dem Konstruktor noch mal aufführe und Anfangswerte zuweise, die dann aber meist im Konstruktor ihren eigentlichen Wert bekommen. Ich denke, dass das auf die Sachen beschränken kann, die nicht neu belegt werden. D. h. vor dem Konstruktor fehlt eine Zeile mit "x = 0". Guter/Schlechter Stil? Egal?
Danke für Eure Antworten und frohes neues Jahr!
1.) Im Kern habe ich eine Klasse, die Daten verarbeitet und mir bereitstellt, so dass ich über die Eigenschaften auf die einzelnen Werte zugreifen kann, was sehr komfortabel ist. Problem ist jetzt, dass ich manchmal nicht alle Daten brauche, d. h. die Klasse ackert enorm, um alle Daten verfügbar zu machen, abfragen will ich aber dann vielleicht nur 2, 3 Attribute. Ich habe mir jetzt überlegt, dass ich es gern so hätte, dass der Basisdatensatz immer bereitgestellt wird und der Rest nur, wenn ich ihn überhaupt explizit abfrage. Mir scheinen die Properties da geeignet, weil ich dann innerhalb der Klasse sagen kann, dass das Tool aus dem Datensatz noch Sachen nachladen soll. Gute Idee oder gibt es einen besseren Ansatz bei solchen Problemen???
2.) Muss ich die Eigenschaften auf unsichtbar stellen, um Properties zu nutzen (so bei Test und es läuft, also privates Attribut __x statt x). Ich versuche zu verstehen, warum das 2. Beispiel Fehler produziert, das erste Beispiel demgegenüber läuft. (Ich habe die Variablen angepasst, um die genaue Fehlerquelle zu finden.)
3.) Ich habe mir bislang angewöhnt, dass ich alle Eigenschaften einer Klasse vor dem Konstruktor noch mal aufführe und Anfangswerte zuweise, die dann aber meist im Konstruktor ihren eigentlichen Wert bekommen. Ich denke, dass das auf die Sachen beschränken kann, die nicht neu belegt werden. D. h. vor dem Konstruktor fehlt eine Zeile mit "x = 0". Guter/Schlechter Stil? Egal?
Code: Alles auswählen
# Properties
class Test(object):
def __init__(self,x):
self.__x = x
def __getX(self):
return self.__x
def __setX(self, x):
self.__x = x
x = property(__getX, __setX)
class Test2(object):
# produziert
# RuntimeError: maximum recursion depth exceeded
# self.x = variable
def __init__(self,variableA):
self.x = variableA
def __getX(self):
return self.x
def __setX(self, variable):
self.x = variable
x = property(__getX, __setX)