Generalmente estoy confundido acerca de la diferencia entre una "propiedad" y un "atributo", y no puedo encontrar un gran recurso para detallar de manera concisa las diferencias.
146
Las propiedades son un tipo especial de atributo. Básicamente, cuando Python encuentra el siguiente código:
spam = SomeObject()
print(spam.eggs)
que mira hacia arriba eggs
en spam
, y luego se examina eggs
para ver si tiene una __get__
, __set__
o __delete__
método - si lo hace, es una propiedad. Si es una propiedad, en lugar de simplemente devolver el eggs
objeto (como lo haría con cualquier otro atributo), llamará al __get__
método (ya que estábamos haciendo una búsqueda) y devolverá lo que ese método devuelva.
Más información sobre el modelo de datos y descriptores de Python .
Con una propiedad, usted tiene control completo sobre sus métodos getter, setter y deleter, que no tiene (si no usa advertencias) con un atributo.
fuente
x
. De una sola mano. Si el usuario de la clase se entera de _x, lo usa bajo su propio riesgo.En términos generales, una propiedad y un atributo son lo mismo. Sin embargo, hay un decorador de propiedades en Python que proporciona acceso getter / setter a un atributo (u otros datos).
fuente
La propiedad le permite obtener y establecer valores como lo haría con los atributos normales, pero debajo hay un método que se llama traducirlo en un getter y setter para usted. En realidad, es solo una conveniencia reducir el límite de llamadas de getters y setters.
Digamos, por ejemplo, que tenía una clase que contenía algunas coordenadas x e y para algo que necesitaba. Para configurarlos es posible que desee hacer algo como:
Es mucho más fácil mirar y pensar que escribir:
El problema es, ¿qué pasa si un día su clase cambia de tal manera que necesita compensar su x e y por algún valor? Ahora necesitaría entrar y cambiar su definición de clase y todo el código que lo llama, lo que podría llevar mucho tiempo y ser propenso a errores. La propiedad le permite usar la sintaxis anterior mientras le brinda la flexibilidad de cambio de la segunda.
En Python, puede definir captadores, definidores y métodos de eliminación con la función de propiedad. Si solo desea la propiedad de lectura, también hay un decorador @property que puede agregar sobre su método.
http://docs.python.org/library/functions.html#property
fuente
Aprendí 2 diferencias del sitio de Bernd Klein, en resumen:
1. La propiedad es una forma más conveniente de encapsular datos.
ej .: si tiene una longitud de atributo público de Object, más adelante, su proyecto requiere que lo encapsule, es decir: cámbielo a privado y proporcione getter y setter => debe cambiar muchos de los códigos que escribió antes:
Si usa @property y @ lenght.setter => no necesita cambiar esos códigos antiguos
2. Una propiedad puede encapsular múltiples atributos
En este ejemplo,
__physic_health
y__mental_health
son privados y no se puede acceder directamente desde afuera, la única forma en que la clase externa interactúa con ellos es a través de la propiedadcondition
fuente
También hay una diferencia no obvia que uso para almacenar en caché o actualizar datos, a menudo tenemos una función conectada al atributo de clase. Por ejemplo, necesito leer el archivo una vez y mantener el contenido asignado al atributo para que el valor se almacene en caché:
Salida:
Accedimos al atributo dos veces, pero nuestra función se activó solo una vez. Cambiar el ejemplo anterior para usar la propiedad hará que el valor del atributo se actualice cada vez que acceda a él:
Salida:
fuente