2010-10-15 19 views
18

Mam klasę z atrybutem, który chcę przekształcić w właściwość, ale ten atrybut jest ustawiony w ramach __init__. Nie wiem, jak to zrobić. Bez ustawiania propert w __init__ jest to łatwe i działa dobrzeJak ustawić właściwość python w __init__

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" 

Ale po inicjalizacji musi nastąpić w __init__ robi się bardziej skomplikowane i nie jestem pewien co do prawidłowego przebiegu działań.

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

Zadziwiająco dla mnie, wydaje się, że następujące czynności działają, ale bardzo źle pachnie.

Jaki jest prawidłowy sposób ustawiania właściwości w __init__?

Dzięki, aaron.

+1

Ogólnie, czy istnieje jakiś powód, aby ustawić "self._date = None" przed aktualizacją właściwości, ponieważ zostanie ona natychmiast zastąpiona nową wartością? –

+0

Nie. Ma sens tylko, jeśli druga linia jest nieobecna, aby uniemożliwić wywołanie gettera bez atrybutu "_date" set – nerdoc

Odpowiedz

17

Nie widzę żadnego poważnego problemu z Twoim kodem. W klasie __init__ klasa jest w pełni tworzona, dzięki czemu właściwości są dostępne.

+0

OK, więc być może patrzę na to w niewłaściwy sposób. W miejscu __init__ jest właściwość już utworzona, więc moje wywołanie self.date uzyskuje dostęp poprzez właściwość jest takie samo jak moje wywołanie st.date? –

+6

Tak, dokładnie (dlaczego Stackoverflow nie lubi krótkich, do-punktów wiadomości? - odmówił wysłania tylko "Tak, dokładnie"). –

+0

+1 Idealnie w prawo. Dodam, że self._date = None in __init__ jest naprawdę bezużyteczne w tym kodzie (w niektórych przypadkach można zainicjować właściwości ukrytych zmiennych w geterze za pomocą RAII ('if not hasrtr (self, _smth): do inicjalizacji. ..') – ThR37

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

Jeśli chcesz ustawić obiekt proxy self._date bez wykonywania Twój seter korzystać z linii # 1. Jeśli chcesz uruchomić program ustawiający przy uruchamianiu, użyj również # 2. Oba sposoby są poprawne, to tylko kwestia tego, czego potrzebujesz.

+1

Dlaczego chcesz ustawić '_date' na' Brak', gdy init jest wyraźnie wywoływany z konkretną 'date'? Powinieneś zapisać poprawną wartość, stąd # 1 nie jest opłacalny. –

Powiązane problemy