2010-10-26 17 views
11

He intentado usar propiedades en lugar de setters y getters específicos en mi aplicación. Parecen más pitónicos y generalmente hacen que mi código sea más legible.Me pregunto si debería dejar de usar propiedades en python

Más legible excepto por un problema: Typos.

Consideremos el siguiente ejemplo sencillo (nota, mis propiedades realmente hacen algún tipo de procesamiento a pesar de que los ejemplos aquí sólo establecer o devolver una variable simple)

class GotNoClass(object): 

    def __init__(self): 
     object.__init__(self) 
     self.__a = None 

    def __set_a(self, a): 
     self.__a = a 

    def __get_a(self): 
     return self.__a 

    paramName = property(__get_a, __set_a) 


if __name__ == "__main__": 
    classy = GotNoClass() 

    classy.paramName = 100 
    print classy.paramName 

    classy.paranName = 200 
    print classy.paramName 

    #oops! Typo above! as seen by this line: 
    print classy.paranName 

La salida, ya que cualquiera que lea un poco más de cerca verán , es:

100 
100 
200 

Oops. No debería haber sido, excepto por el hecho de que cometí un error tipográfico: escribí paranName (dos n) en lugar de paramName.

Esto es fácil de depurar en este simple ejemplo, pero me ha estado perjudicando en mi proyecto más grande. Como Python felizmente crea una nueva variable cuando accidentalmente quise utilizar una propiedad, recibo errores sutiles en mi código. Errores que a veces encuentro difíciles de rastrear. Peor aún, una vez usé el mismo error dos veces (una cuando estaba configurando y más tarde una vez cuando estaba recibiendo), así que mi código parecía estar funcionando pero mucho más tarde, cuando una rama diferente de código finalmente intentó acceder a esta propiedad (correctamente) Obtuve el valor incorrecto, pero me tomó varios días antes de darme cuenta de que mis resultados estaban un poco desactualizados.

Ahora que sé que esto es un problema, paso más tiempo leyendo detenidamente mi código, pero idealmente tendría una forma de detectar esta situación automáticamente; si omito solo uno, puedo introducir un error que no aparece hasta que haya pasado un poco de tiempo ...

Así que me pregunto, ¿debería cambiar a usar viejos setters y getters? ¿O hay alguna forma ordenada de evitar esta situación? ¿La gente simplemente confía en sí misma para detectar estos errores de forma manual? Por desgracia, no soy un programador profesional, solo alguien que intenta hacer algunas cosas aquí en el trabajo y realmente no sé cuál es la mejor manera de abordar esto.

Gracias.

P.S. Entiendo que este es también uno de los beneficios de Python y no me quejo de eso. Me preguntaba si sería mejor usar setters y getters explícitos.

+0

Lo mismo ocurre con los atributos simples, sin mencionar las variables locales. Es un efecto secundario directo del diseño del lenguaje y tratar de "arreglarlo" generalmente causará problemas mayores. Aunque nunca he encontrado que sea un gran problema. –

+0

Esto es absolutamente cierto y después de publicar lo pensé un poco más. Creo que la razón por la que está sucediendo más es porque ahora dependo tanto de las propiedades (en comparación con mis viejos setters y getters) y entonces es más probable que me encuentre con un error como ese. El truco será minimizar el problema tanto como sea posible y tener más cuidado. – Ben

Respuesta

0

Hay momentos en que la verificación en tiempo de compilación realmente ahorra tiempo. Parece que has identificado uno de esos casos. Por accidente, en lugar de elección cuidadosa, uso getters y setters, y estoy contento ;-)

2

Dependiendo de cómo funcione su código, puede intentar usar slots. Obtendrá una excepción AttributeError cuando intente asignar algo que no está en las ranuras, lo que hará que ese tipo de error sea más obvio.

+0

Wow.Las máquinas tragamonedas son muy interesantes (y nuevas para mí). Definitivamente los implementaré como parte de mi aplicación, pero no para resolver este problema. Por esto, parece que podría ser un abuso de su propósito previsto (que, según tengo entendido, es reducir las huellas de memoria de los objetos que probablemente se instanciarán muchas veces). Una cosa que estoy considerando, sin embargo, es usarlos temporalmente durante el desarrollo y luego apagarlos una vez que haya completado mi código - de esa manera me mantendrán honesto ahora pero no estaré realmente en uso (¿o abusando?) Una vez que mi aplicación esté completar. – Ben

+0

Pensándolo bien, mirando algunas de las consecuencias involuntarias del uso de __slots__, no los implementaré ni siquiera durante el desarrollo. Aún así es genial saberlo. – Ben

Cuestiones relacionadas