2010-10-15 10 views
18

Ho una classe con un attributo che desidero trasformare in una proprietà, ma questo attributo è impostato su __init__. Non sono sicuro di come dovrebbe essere fatto. Se non si imposta la propert in __init__ questo è facile e funziona beneCome impostare una proprietà python in __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" 

Ma una volta che l'inizializzazione deve avvenire in __init__ diventa più complicato e non sono sicuro della corretta linea di condotta.

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

Stranamente per me, il seguente sembra funzionare ma ha un cattivo odore.

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 

Qual è il modo corretto per andare sull'impostazione delle proprietà in __init__?

Grazie, aaron.

+1

In generale, c'è qualche motivo per impostare 'self._date = None' prima di aggiornare la proprietà poiché verrà immediatamente sovrascritta con il nuovo valore? –

+0

No. Ha senso solo se la seconda linea è assente per impedire che il getter venga chiamato senza attributo "_date" impostato – nerdoc

risposta

17

Non vedo alcun problema reale con il codice. In __init__, la classe è completamente creata e quindi le proprietà accessibili.

+0

Ok, quindi forse sto guardando questo nel modo sbagliato. Al punto di __init__ è la proprietà già creata quindi la mia chiamata a self.date sta accedendo tramite la proprietà è la stessa che è la mia chiamata a st.date? –

+6

Sì, esattamente (perché Stackoverflow non ama i messaggi brevi, to-the-point? - si è rifiutato di pubblicare solo "Sì, esattamente"). –

+0

+1 perfettamente a destra. Vorrei aggiungere che il self._date = None in __init__ è davvero inutile in questo codice (in alcuni casi è possibile mettere l'inizializzazione delle proprietà delle variabili nascoste nel getter usando RAII ('if not hasattr (self, _smth): do initialization. ..') – ThR37

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

Se si desidera impostare l'oggetto proxy self._date senza eseguire il tuo setter usa la linea # 1. Se si desidera eseguire il setter all'avvio, utilizzare anche il n. 2. Entrambi i modi sono corretti, è solo una questione di cosa hai bisogno.

+1

Perché dovresti impostare '_date' su' None' quando init viene chiamato chiaramente con qualche particolare 'date'? Dovresti memorizzare il valore corretto, quindi # 1 non è fattibile. –

Problemi correlati