Variable vorbelegen
Ich werde mir die Lösung, also den Vorschlag ansehen.
Wenn du eine ganz ehrliche Antwort haben magst: das Abstraktionslevel. Einen "Schalter" kann ich mir gut vorstellen; property und cached_property ist mir nicht eingängig. Das ist kein Argument gegen die Lösung.
Es wird noch was dauern, bis ich die Lösung mal eingeben kann. Im Augenblick habe ich viele Baustellen...
Wenn du eine ganz ehrliche Antwort haben magst: das Abstraktionslevel. Einen "Schalter" kann ich mir gut vorstellen; property und cached_property ist mir nicht eingängig. Das ist kein Argument gegen die Lösung.
Es wird noch was dauern, bis ich die Lösung mal eingeben kann. Im Augenblick habe ich viele Baustellen...
-
BlackJack
@pixewakb: Also das Abstraktionslevel bei `property()` ist doch sehr überschaubar. Wenn man Getter/Settermethoden verstanden hat, dann ist das doch bloss noch syntaktischer Zucker um solche Methoden in ein ”berechnetes Attribut” umzuwandeln.
-
BlackJack
@pixewakb: Ich habe das Beispiel noch mal gelesen und es scheint Du brauchst einen anderen Wert als `None` für das vorbelegen weil `None` auch das Ergebnis sein kann. Vielleicht deswegen Deine Fixierung auf `False` die hier alle so ein bisschen irritiert. Das ist deswegen keine gute Idee weil bei einem anderen Wert ja vielleicht auch `False` ein legitimes Ergebnis sein könnte, und damit hast Du dann wieder das gleiche Problem. Für solche Fälle führt man einfach einen garantiert einmaligen, sonst für nichts anderes verwendeten Wert ein gegen den man prüfen kann. Dein Beispiel könnte dann so aussehen:
Ich habe hier das Attribut mal als Implementierungsdetail gekennzeichnet weil es ja problematisch sein kann darauf direkt zuzugreifen.
Und jetzt machen wird daraus mal ein Property, so dass man einfach auf `datenset.messergebnis_a` zugreifen kann und nicht selbst explizit eine `get_*()`-Methode aufrufen muss. Die einzigen beiden, winzigen Änderungen sind das man die Getter-Methode mit ``@property`` dekoriert und die Methode so umbenennt das sie wie das berechnete Attribut heisst das man damit erstellen möchte:
Code: Alles auswählen
NOT_YET_EVALUATED = object()
class Datenset(object):
def __init__(self, url):
self.html = self.seite_laden(url)
self._messdaten_a = NOT_YET_EVALUATED
def get_messdaten_a(self):
if self._messdaten_a is NOT_YET_EVALUATED:
# Wenn die Seite noch nicht
# ausgewertet wurde, dann
# erledige das
try:
self._messdaten_a = self.auswerten(self.html)
# Wenn das Objekt keine Messdaten a
# besitzt, dann None
except: # FIXME Konkrete Ausnahmen angeben.
self._messdaten_a = None
return self._messdaten_aUnd jetzt machen wird daraus mal ein Property, so dass man einfach auf `datenset.messergebnis_a` zugreifen kann und nicht selbst explizit eine `get_*()`-Methode aufrufen muss. Die einzigen beiden, winzigen Änderungen sind das man die Getter-Methode mit ``@property`` dekoriert und die Methode so umbenennt das sie wie das berechnete Attribut heisst das man damit erstellen möchte:
Code: Alles auswählen
NOT_YET_EVALUATED = object()
class Datenset(object):
def __init__(self, url):
self.html = self.seite_laden(url)
self._messdaten_a = NOT_YET_EVALUATED
@property
def messdaten_a(self):
if self._messdaten_a is NOT_YET_EVALUATED:
# Wenn die Seite noch nicht
# ausgewertet wurde, dann
# erledige das
try:
self._messdaten_a = self.auswerten(self.html)
# Wenn das Objekt keine Messdaten a
# besitzt, dann None
except: # FIXME Konkrete Ausnahmen angeben.
self._messdaten_a = None
return self._messdaten_a