Respuesta

17

Iain, esto es, básicamente, una pregunta es la terminología y, a pesar de la etiqueta de "independiente del idioma" asociado a esta pregunta, muy lenguaje/entorno relacionado.

Para discusiones de diseño, sake, property y 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 hablamos 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.

+1

+1: Definitivamente está relacionado con el idioma. – Powerlord

+0

sí, pobre java .... todavía no tiene propiedades :( –

2

ejemplo de código hecho en C#

public class ClassName 
{ 
    private string variable; 

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

En adición a lo que se ha dicho, en un lenguaje como C#, una propiedad es esencialmente una función de obtención y ajuste. Como resultado, puede tener una lógica personalizada que se ejecute además del get/setting. Una variable de instancia no puede hacer esto.

1

Tal vez sea porque viniste de C++ ¿verdad? 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 Propiedades apear! en Java y .NET. Entonces creo que es mejor que lo llames miembros. Si son miembros de instancias (o como lo llamó la variable de instancia) o miembros de la clase ...

¡Salud!

1

Una propiedad puede, y supongo que lo hace principalmente, devolver una variable de instancia, pero puede hacer más. Podría poner 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 ir a los métodos.

0

Una propiedad es algún tipo de dato asociado a 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 tiene que corresponder directamente con una propiedad. Por ejemplo (heh), 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 propiedades de "primera clase". Esto significa que para una aplicación cliente, la propiedad se ve y se utiliza 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ía circle.radius = 5.

3

Hershi tiene razón sobre esto siendo un idioma específico. Pero para agregar al rastro de respuestas específicas de idioma:

En python, una variable de instancia es un atributo de una instancia, (generalmente) algo a lo que se hace referencia 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. Así, en la siguiente definición de clase (modificado de Guido de new style object manifesto):

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 el otro código no acceda directamente a ella). El beneficio de las propiedades en python es que el diseñador no tiene que dar vueltas. encapsulando preventivamente todas las variables de instancia, ya que la encapsulación futura convirtiendo una variable de instancia a una propiedad no debería romper ningún código existente (a menos que el código aproveche las lagunas que su encapsulación está tratando de arreglar, o confiar en la inspección de clase o algún 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 las propiedades. Es indiferente en cuanto a qué tipo de encapsulación 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.

0

En contraste con las otras respuestas dadas, I do creo que hay una distinción útil entre las variables miembro y las propiedades que son independientes del idioma.

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 en la configuración del tiempo de diseño de un componente como la manipulación de las "propiedades" de un objeto. Por ejemplo, elijo los colores de primer plano y de fondo, el estilo de borde y la fuente de un campo de entrada de texto estableciendo sus propiedades. Si bien estas propiedades podrían cambiarse en tiempo de ejecución, normalmente no lo son. En tiempo de ejecución, es mucho más probable que se lean y escriban un conjunto diferente de variables, que representa el contenido del campo. Pienso en esta información como el "estado" del componente.

¿Por qué es útil esta distinción? Cuando se crea una abstracción para el cableado de componentes, generalmente solo se deben exponer las variables de "estado". Volviendo al ejemplo de 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.

2

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 = "cheeseburger" en realidad se interpreta como [mi setFood: "cheeseburger"]. Este es otro caso donde la definición definitivamente no es independiente del lenguaje porque object-c define la palabra clave @property.

Cuestiones relacionadas