Pregunta

¡Creo que he estado usando estos términos de manera intercambiable / errónea!

¿Fue útil?

Solución

Iain, esto es básicamente una cuestión de terminología y, a pesar del " idioma-agnóstico " etiqueta asociada con esta pregunta, muy relacionada con el idioma / entorno.

Para discusiones de diseño, la propiedad y la variable de instancia se pueden usar indistintamente, ya que la idea es que una propiedad es un elemento de datos que describe un objeto.

Cuando se habla de un idioma específico, estos dos pueden ser diferentes. Por ejemplo, en C # una propiedad es en realidad una función que devuelve un objeto, mientras que una variable de instancia es una variable miembro no estática de una clase.

Otros consejos

Hershi tiene razón en que este lenguaje es específico. Pero para agregar al rastro de respuestas específicas del idioma:

En Python, una variable de instancia es un atributo de una instancia, (generalmente) algo que se menciona en el diccionario de la instancia. Esto es análogo a los miembros o variables de instancia en Java, excepto que todo es público.

Las propiedades son accesos directos a los métodos getter / setter que se parecen a una variable de instancia . Por lo tanto, en la siguiente definición de clase (modificada desde el nuevo objeto de estilo de Guido ):

class C(object):

    def __init__(self):
        self.y = 0

    def getx(self):
        if self.y < 0: return 0
        else: return self.y

    def setx(self, x):
        self.y = x

    x = property(getx, setx)

>>> z = C()
>>> z.x = -3
>>> print z.x
0
>>> print z.y
-3
>>> z.x = 5
>>> print z.x
5
>>> print z.y
5

y es una variable de instancia de z , x es una propiedad. (En general, cuando se define una propiedad, hay algunas técnicas utilizadas para ocultar la variable de instancia asociada para que otro código no acceda directamente a ella). El beneficio de las propiedades en Python es que un diseñador no tiene que andar encapsulando de manera preventiva todas las variables de instancia, ya que la encapsulación futura al convertir una variable de instancia en una propiedad no debería romper ningún código existente (a menos que el código esté aprovechando las lagunas que su encapsulación está tratando de arreglar, o confiando en la inspección de clase u otro meta -programación técnica).

Todo esto es una respuesta muy larga para decir que a nivel de diseño, es bueno hablar de propiedades. Es indiferente en cuanto al tipo de encapsulación que puede necesitar realizar. Supongo que este principio no es independiente del lenguaje, pero se aplica a los idiomas que se encuentran al lado de python.

ejemplo de código hecho en C #

public class ClassName
{
   private string variable;

   public string property
   {
      get{ return variable; }
      set { variable = value; }
   }
}

En el objetivo c, una propiedad es una variable de instancia que puede aprovechar un operador de punto sobrecargado para llamar a su setter y getter. Entonces my.food = " hamburguesa con queso " en realidad se interpreta como [mi setFood: " cheeseburger "]. Este es otro caso en el que la definición definitivamente no es independiente del lenguaje porque el objetivo-c define la palabra clave @property.

Tal vez eso es porque primero viniste de C ++, ¿no? En mis días de escuela tenía profesores que decían propiedades de clase o atributos de clase todo el tiempo. Desde que me mudé al mundo de Java C #, comencé a escuchar acerca de los miembros. Miembros de la clase, miembros de la instancia ...

Y luego aparecen las propiedades! en Java y .NET. Así que creo que es mejor para ustedes llamarlo miembros. Si son miembros de la instancia (o como la llamaron variable de instancia) o miembros de la clase ...

¡Salud!

Una propiedad puede, y supongo que la mayoría lo hace, devolver una variable de instancia pero puede hacer más. Podría poner la lógica en una propiedad, agregar valores o actualizar otras variables de instancia, etc. Sin embargo, creo que es mejor evitar hacerlo. La lógica debería entrar en métodos.

En Java tenemos algo llamado Propiedades JavaBeans , pero esa es básicamente una variable de instancia que sigue un cierto patrón de nombres para su captador y definidor.

Al agregar a lo que se ha dicho, en un lenguaje como C #, una propiedad es esencialmente una función de obtener y establecer. Como resultado, puede tener una lógica personalizada que se ejecuta además de la obtención / configuración. Una variable de instancia no puede hacer esto.

Una propiedad es un tipo de datos asociados con un objeto. Por ejemplo, una propiedad de un círculo es su diámetro, y otra es su área.

Una variable de instancia es un dato que se almacena dentro de un objeto. No necesariamente debe corresponder directamente con una propiedad. Por ejemplo (je), un círculo puede almacenar su radio en una variable de instancia y calcular su diámetro y área en función de ese radio. Las tres siguen siendo propiedades, pero solo el radio se almacena en una variable de instancia.

Algunos idiomas tienen el concepto de "primera clase" propiedades Esto significa que para una aplicación cliente, la propiedad se ve y se usa como una variable de instancia. Es decir, en lugar de escribir algo como circle.getDiameter () , escribiría circle.diameter , y en lugar de circle.setRadius (5) , escribirías circle.radius = 5 .

A diferencia de las otras respuestas dadas, do creo que hay una distinción útil entre las variables de los miembros y las propiedades que es agnóstico del lenguaje.

La distinción es más evidente en la programación orientada a componentes, que es útil en cualquier lugar, pero más fácil de entender en una interfaz gráfica de usuario. En ese contexto, tiendo a pensar que la configuración en tiempo de diseño de un componente manipula las " propiedades " de un objeto Por ejemplo, elijo los colores de fondo y primer plano, el estilo de borde y la fuente de un campo de entrada de texto al establecer sus propiedades. Si bien estas propiedades podrían cambiarse en tiempo de ejecución, normalmente no lo son. En el tiempo de ejecución, es mucho más probable que se lean y escriban un conjunto diferente de variables, que representan el contenido del campo. Pienso en esta información como el "estado" del componente.

¿Por qué es útil esta distinción? Al crear una abstracción para cablear componentes juntos, generalmente solo el estado " " Las variables necesitan ser expuestas. Volviendo al ejemplo del campo de texto, puede declarar una interfaz que proporciona acceso al contenido actual. Pero las '' propiedades '' que controlan la apariencia del componente solo se definen en una clase de implementación concreta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top