2012-06-10 15 views
7

Solo una pregunta rápida, estoy teniendo un poco de dificultad para entender dónde usar las propiedades frente a dónde utilizarlas con los viejos atributos simples. La distinción para mí es un poco borrosa. Cualquier recurso sobre el tema sería excelente, ¡gracias!Cuándo usar atributos vs. cuándo usar propiedades en python?

+3

Sólo tiene que utilizar atributos regulares hasta que usted encuentra que tiene que hacer algo "especial" durante el atributo de obtener o establecer. Luego usa una propiedad. O bien, si desea que el atributo sea de solo lectura. – Keith

+0

Me resulta extraño cómo la gente de la comunidad Python parece entender la respuesta correcta a esta pregunta mucho más que las personas de la comunidad C#, donde tienen herramientas que funcionan de la misma manera. –

Respuesta

15

Las propiedades son más flexibles que los atributos, ya que puede definir funciones que describen lo que se supone que debe suceder al configurarlas, obtenerlas o eliminarlas. Si no necesita esta flexibilidad adicional, use atributos: son más fáciles de declarar y más rápidos.

En idiomas como Java, por lo general se recomienda siempre escribir getters y setters, para tener la opción de reemplazar estas funciones con versiones más complejas en el futuro. Esto no es necesario en Python, ya que la sintaxis del código del cliente para acceder a los atributos y propiedades es la misma, por lo que siempre puede optar por usar las propiedades más adelante, sin romper la compatibilidad hacia atrás.

+0

+1, pero diría todo lo contrario, es decir, para mí, _attribute_ es más flexible, en el sentido de que está _completamente_ libre, puede hacer lo que quiera con los datos, tanto desde adentro como desde afuera. Por otro lado, una _property_ está enganchada, controlada, restringida, restringida (pero estoy de acuerdo en que podemos ver estas capacidades como una especie de _flexibilidad_ también) por un mecanismo de encapsulación ... Pero supongo que significa lo mismo , solo la manera de decirlo que es diferente :-) – cedbeu

+0

@cblab: La pregunta se planteó desde el punto de vista de un * implementador de clase *. Para un implementador de clase, las propiedades son más flexibles, ya que puede simular el comportamiento exacto de los atributos con propiedades. –

+0

ah, sí, cierto ... Debo admitir que nunca he pensado en simular el uso de un atributo con una propiedad ... algo inútil, ¿no? Es como agregar líneas de código que no tienen otro objetivo que estar ahí :) Pero tiene toda la razón, en este sentido puede hacer más, por lo que tiene más flexibilidad. – cedbeu

13

El punto es que la sintaxis es intercambiable. Siempre comience con atributos. Si encuentra que necesita cálculos adicionales al acceder a un atributo, reemplácelo con una propiedad.

+4

¡Esto es lo más importante! En otros idiomas (* tos * Java * tos *), una vez que haya definido que algo sea un atributo, no podrá volver atrás y cambiarlo más adelante si desea tener más control. Entonces debe escribir todos estos getters y setters innecesarios para que tenga la opción de cambiarlos más tarde. En Python, puede simplemente escribir atributos simples y reemplazarlos internamente con propiedades más adelante sin cambiar la API externa en absoluto. – katrielalex

+0

No estoy completamente de acuerdo. A veces uno puede querer comenzar con la definición de algo para ser una propiedad. Por ejemplo, cuando quiere que su valor sea de solo lectura, o es algo que se puede calcular cuando es necesario, pero no se hace referencia a él con la frecuencia suficiente para justificar el almacenamiento de su valor en cada instancia. – martineau

+0

Siempre puede cambiar cualquier cosa en cualquier idioma; solo es cuestión de cuánto trabajo está involucrado. –

0

Además de lo que dijo Daniel Roseman, a menudo uso propiedades cuando estoy envolviendo algo, es decir, cuando no almaceno la información yo mismo pero el objeto envuelto sí lo hace. Entonces las propiedades son excelentes accesorios.

+0

Sí, de hecho, puede generar estos automáticamente desde el objeto envuelto, y luego su objeto tiene todos los métodos y atributos de lo que está envolviendo. Muy útil. – kindall

1

Las propiedades son atributos + a posteriori encapsulación.

Cuando se activa un atributoen una propiedad , que acaba de definir algunos getter y setter que "conectar" a la misma, que se gancho el acceso a los datos. Entonces, no necesita volver a escribir el resto de su código, la forma de acceder a los datos es la misma, sea cual sea su atributo es una propiedad o no.

Gracias a este mecanismo de encapsulación muy inteligente y de gran alcance, en Python que por lo general pueden ir con atributos (sin a priori encapsulación, sin ningún tipo captador ni colocador), a menos que hay que hacer especial cosas al acceder a los datos.

Si es así, entonces sólo puede definir set y captadores, sólo si es necesario, y "conectar" en el atributo, convirtiéndolo en una propiedad, sin ninguna incidencia en el resto de su código (mientras en Java, lo primero que se hace normalmente cuando se crea un campo , por lo general privada, es la creación que está asociado getter y setter método).

Niza página acerca de atributos, propiedades y descriptores here

Cuestiones relacionadas