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.
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. –
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