2010-10-15 15 views
18

Tengo una clase con un atributo que deseo convertir en una propiedad, pero este atributo se establece en __init__. No estoy seguro de cómo se debe hacer esto. Sin ajustar el propert en __init__ esto es fácil y funciona bienCómo establecer una propiedad de python en __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" 

Pero una vez que la inicialización tiene que ocurrir en __init__ se vuelve más complicado y no estoy seguro de la línea de acción correcta.

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

extraño para mí, la siguiente parece funcionar, pero huele muy mal.

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 

¿Cuál es la forma correcta de ir sobre la configuración de las propiedades en __init__?

Gracias, aaron.

+1

En general, ¿hay alguna razón para establecer 'self._date = None' antes de actualizar la propiedad ya que se sobrescribirá inmediatamente con el nuevo valor? –

+0

No. Solo tiene sentido si la segunda línea está ausente para evitar que se invoque el captador sin ningún atributo "_date" establecido – nerdoc

Respuesta

17

No veo ningún problema real con su código. En __init__, la clase está completamente creada y, por lo tanto, las propiedades son accesibles.

+0

Ok, entonces tal vez estoy viendo esto de la manera incorrecta. En el punto de __init__, ¿la propiedad ya creada para que mi llamada a self.date esté accediendo a través de la propiedad es de la misma manera que mi llamada a st.date? –

+6

Sí, exactamente (¿por qué a Stackoverflow no le gustan los mensajes cortos, al punto? - se negó a publicar simplemente "Sí, exactamente"). –

+0

+1 Perfectamente a la derecha. Añadiría que self._date = None en __init__ es realmente inútil en este código (en algunos casos puedes poner la inicialización de las propiedades variables ocultas en el 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 

Si desea establecer el objeto proxy self._date sin ejecutar el colocador utilizar la línea # 1. Si desea ejecutar setter al inicio, use el # 2. Ambas formas son correctas, solo se trata de lo que necesitas.

+1

¿Por qué querría configurar '_date' en' None' cuando se llama claramente init con alguna 'fecha' particular? Debe almacenar el valor correcto, por lo tanto, el # 1 no es viable. –

Cuestiones relacionadas