Pergunta

Eu acho que eu tenho usado estes termos interchangably / errada!

Foi útil?

Solução

Iain, este é basicamente uma questão terminologia e é, apesar da tag "linguagem-agnóstico" associada a esta questão, muito linguagem / ambiente relacionados.

Para discussões de design causa, propriedade e variável de instância podem ser usados ??alternadamente, uma vez que a ideia é que a propriedade é um item de dados que descrevem um objeto.

Quando se fala de uma linguagem específica estes dois podem ser diferentes. Por exemplo, em C # uma propriedade é, na verdade, uma função que devolve um objecto, enquanto uma variável de exemplo é uma variável membro não-estática de uma classe.

Outras dicas

Hershi é direito sobre este idioma ser específico. Mas para adicionar à trilha de respostas específicas da linguagem:

Em Python, uma variável de instância é um atributo de uma instância, (geralmente) algo que é referido no dicionário da instância. Isso é análogo aos membros ou variáveis ??de instância em Java, exceto tudo é público.

As propriedades são atalhos para métodos getter / setter que olhar apenas como uma variável de instância . Assim, na seguinte definição de classe (modificado a partir do novo estilo de objeto manifesto 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 é uma variável de instância de z, x é uma propriedade. (Em geral, onde uma propriedade é definida, existem algumas técnicas usadas para obscurecer a variável de instância associada de modo que outro código não acessá-lo diretamente.) O benefício de propriedades em python é que um designer não tem que ir ao redor preventivamente encapsular todas as variáveis ??de instância, uma vez que o futuro encapsulamento através da conversão de uma variável de instância a uma propriedade não deve quebrar o código existente (a menos que o código está aproveitando brechas seu encapsulamento está tentando consertar, ou depender de inspeção de classe ou alguma outra meta técnica -Programação).

Tudo isso é uma resposta muito longa para dizer que a nível de design, é bom para falar sobre propriedades. É agnóstico como a que tipo de encapsulamento pode ser necessário para executar. Eu acho que este princípio não é agnóstico língua, mas se aplica a línguas ao lado python.

exemplo de código feito em C #

public class ClassName
{
   private string variable;

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

Em Objective C, uma propriedade é uma variável de instância que pode tirar proveito de um operador ponto sobrecarregado para chamar seu setter e getter. Então my.food = "cheeseburger" é na verdade interpretado como [minha setFood: "cheeseburger"]. Este é outro caso em que a definição não é, definitivamente, agnóstico língua, porque Objective-C define a palavra-chave @property.

Talvez isso é porque você veio pela primeira vez a partir de C ++ certo ?! Em meus tempos de escola eu tive professores que diziam propriedades de classe ou atributos de classe o tempo todo. Desde que me mudei para o # mundo Java C, comecei a ouvir sobre membros. Os membros da classe, membros de instância ...

E, em seguida, em Propriedades apear! em Java e .NET. Então eu acho que é melhor para você chamá-lo de membros. Wheather eles são membros de instância (ou como você chamou de instância variável) ou membros da classe ....

Felicidades!

A propriedade pode, e suponho que a maioria faz, retornar uma variável de instância, mas pode fazer mais. Você poderia colocar lógica em uma propriedade, valores agregados ou atualizar outras variáveis ??de instância etc. Eu acho que é melhor evitar fazê-lo no entanto. Logic deve entrar em métodos.

Em Java nós temos algo chamado JavaBeans Propriedades , mas que é basicamente uma variável de instância que segue um determinado padrão de nomenclatura para o seu getter e setter.

Ao acrescentar ao que já foi dito, em um langauge como C #, uma propriedade é essencialmente um get e função set. Como resultado, ele pode ter lógica personalizada que é executado em adição à / configuração recebendo. Uma variável de instância não pode fazer isso.

A propriedade é algum tipo de dados associados com um objeto. Por exemplo, uma propriedade de um círculo é o seu diâmetro, e outra é a sua área.

Uma variável de exemplo é um pedaço de dados que é armazenado dentro de um objecto. Não precisa necessariamente correspondem diretamente com uma propriedade. Por exemplo (heh), um círculo pode armazenar o seu raio em uma variável de exemplo, e calcular o seu diâmetro e a área de base em que o raio. Todos os três são ainda propriedades, mas apenas o raio é armazenado em uma variável de instância.

Algumas línguas têm o conceito de propriedades "primeira classe". Isto significa que para um aplicativo cliente, a propriedade olha e é usado como uma variável de instância. Ou seja, em vez de escrever algo como circle.getDiameter(), você escreveria circle.diameter, e em vez de circle.setRadius(5), você escreveria circle.radius = 5.

Em contraste com as outras respostas dadas, eu do pensar que há uma distinção útil entre as variáveis ??de membros e propriedades que é a linguagem-agnóstico.

A distinção é mais aparente na programação orientada a componente, que é em qualquer lugar útil, mas mais fácil de entender em uma interface gráfica do usuário. Nesse contexto, que tendem a pensar na configuração de tempo de design de um componente como manipular as "propriedades" de um objecto. Por exemplo, eu escolho as cores de primeiro plano e fundo, o estilo de borda e fonte de um campo de entrada de texto, definindo suas propriedades. Enquanto estas propriedades pode ser alterado em tempo de execução, que normalmente não são. Em tempo de execução, um conjunto diferente de variáveis, representando o conteúdo do campo, são muito mais propensos a ser lidos e escritos. Eu acho que esta informação como o "estado" do componente.

Porque é que esta distinção útil? Ao criar uma abstração para componentes de fiação juntos, normalmente apenas as variáveis ??"estado" precisam ser expostos. Voltando ao exemplo de campo de texto, você pode declarar uma interface que permite o acesso ao conteúdo atual. Mas as "propriedades" que controlam a aparência do componente são definidos apenas em uma classe de implementação concreta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top