2010-10-15 8 views
18

Ich habe eine Klasse mit einem Attribut, das ich in eine Eigenschaft verwandeln möchte, aber dieses Attribut wird innerhalb __init__ gesetzt. Nicht sicher, wie das gemacht werden sollte. Ohne Einstellung der propert in __init__ dies ist einfach und funktioniert gutWie Sie eine Python-Eigenschaft in __init__ setzen

import datetime 

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self): 
     self._date = None 

    @property 
    def date(self): 
     return self._date 

    @date.setter 
    def date(self, value): 
     d = datetime.datetime.strptime(value, "%d-%b-%y") 
     self._date = d 

st = STransaction() 
st.date = "20-Jan-10" 

Aber sobald die Initialisierung in __init__ erfolgen muss wird es komplizierter, und ich bin nicht sicher, die richtige Vorgehensweise.

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None 

Seltsamerweise scheint das folgende zu funktionieren, riecht aber sehr schlecht.

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None 
     self.date = date 

    @property 
    def date(self): 
     return self._date 

    @date.setter 
    def date(self, value): 
     d = datetime.datetime.strptime(value, "%d-%b-%y") 
     self._date = d 

Was ist der richtige Weg, um über das Festlegen von Eigenschaften in __init__ zu gehen?

Danke, aaron.

+1

Gibt es im Allgemeinen einen Grund, 'self._date = None' zu ​​setzen, bevor die Eigenschaft aktualisiert wird, da sie sofort mit dem neuen Wert überschrieben wird? –

+0

Nein. Es macht nur Sinn, wenn die zweite Zeile abwesend ist, um zu verhindern, dass der Getter ohne Attribut "_date" aufgerufen wird. – nerdoc

Antwort

17

Ich sehe kein echtes Problem mit Ihrem Code. In __init__ ist die Klasse vollständig erstellt und damit die Eigenschaften zugänglich.

+0

Ok, also vielleicht schaue ich das falsch an. Zum Zeitpunkt von __init__ ist die Eigenschaft bereits erstellt, so dass mein Aufruf von self.date über die Eigenschaft auf die gleiche Weise wie mein Aufruf von st.date zugreift? –

+6

Ja, genau (warum mag Stackoverflow keine kurzen, zielgerichteten Nachrichten? - es hat sich geweigert, nur "Ja, genau" zu posten). –

+0

+1 Perfekt richtig. Ich würde hinzufügen, dass das self._date = None in __init__ in diesem Code wirklich nutzlos ist (Sie können in einigen Fällen die Initialisierung von Eigenschaften versteckten Variablen in den Getter mit RAII setzen ('falls nicht hasattr (self, _smth): Initialisierung durchführen. ..) – ThR37

4
class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None #1 
     self.date = date #2 

Wenn Sie Ihren Setter verwenden, um die # 1 Zeile ohne Ausführen des Proxy self._date Objekt festlegen möchten. Wenn Sie den Setter beim Start auch ausführen möchten, verwenden Sie die # 2. Beide Wege sind richtig, es ist nur eine Frage dessen, was du brauchst.

+1

Warum sollten Sie '_date' auf' None' setzen, wenn init eindeutig mit einem bestimmten 'date' aufgerufen wird? Sie sollten den richtigen Wert speichern, daher ist # 1 nicht lebensfähig. –