Domanda

Penso di aver usato questi termini in modo intercambiabile / errato!

È stato utile?

Soluzione

Iain, questa è sostanzialmente una domanda terminologica ed è, nonostante il "linguaggio agnostico" tag associato a questa domanda, molto legato alla lingua / all'ambiente.

Per amor di discussione di progettazione, la proprietà e la variabile di istanza possono essere usate in modo intercambiabile, poiché l'idea è che una proprietà sia un elemento di dati che descrive un oggetto.

Quando si parla di una lingua specifica, questi due possono essere diversi. Ad esempio, in C # una proprietà è in realtà una funzione che restituisce un oggetto, mentre una variabile di istanza è una variabile membro non statica di una classe.

Altri suggerimenti

Hershi ha ragione su questo essere specifico della lingua. Ma per aggiungere alla scia di risposte specifiche per la lingua:

In Python, una variabile di istanza è un attributo di un'istanza, (generalmente) qualcosa a cui si fa riferimento nel dizionario dell'istanza. Ciò è analogo ai membri o alle variabili di istanza in Java, tranne per il fatto che tutto è pubblico.

Le proprietà sono collegamenti a metodi getter / setter che sembrano proprio una variabile di istanza . Pertanto, nella seguente definizione di classe (modificata dal nuovo manifesto di oggetti di stile ):

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 è una variabile di istanza di z , x è una proprietà. (In generale, dove viene definita una proprietà, ci sono alcune tecniche utilizzate per oscurare la variabile di istanza associata in modo che altri codici non possano accedervi direttamente.) Il vantaggio delle proprietà in Python è che un designer non deve andare in giro incapsulando preventivamente tutte le variabili di istanza, poiché l'incapsulamento futuro convertendo una variabile di istanza in una proprietà non dovrebbe violare alcun codice esistente (a meno che il codice non stia sfruttando le lacune che l'incapsulamento sta tentando di correggere o facendo affidamento sull'ispezione di classe o su qualche altra meta tecnica di programmazione).

Tutto questo è una risposta molto lunga per dire che a livello di progettazione, è bene parlare di proprietà. È agnostico su quale tipo di incapsulamento potrebbe essere necessario eseguire. Immagino che questo principio non sia agnostico, ma si applica alle lingue accanto a Python.

esempio di codice fatto in C #

public class ClassName
{
   private string variable;

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

Nell'obiettivo c, una proprietà è una variabile di istanza che può trarre vantaggio da un operatore punto sovraccarico per chiamare il suo setter e getter. Quindi my.food = " cheeseburger " viene in realtà interpretato come [il mio setFood: " cheeseburger "]. Questo è un altro caso in cui la definizione non è assolutamente indipendente dalla lingua poiché goal-c definisce la parola chiave @property.

Forse è perché sei venuto per la prima volta dal C ++ giusto ?! Durante i miei giorni di scuola avevo professori che dicevano continuamente proprietà o attributi di classe. Da quando mi sono trasferito nel mondo Java C #, ho iniziato a conoscere i membri. Membri della classe, membri dell'istanza ...

E poi le Proprietà appaiono! in Java e .NET. Quindi penso che sia meglio per te chiamarlo membri. Ogni volta che sono membri di istanza (o come la chiamavi variabile di istanza) o membri della classe ....

Cheers!

Una proprietà può, e suppongo che lo faccia principalmente, restituire una variabile di istanza ma può fare di più. Potresti mettere la logica in una proprietà, aggregare i valori o aggiornare altre variabili di istanza ecc. Penso che sia meglio evitare di farlo comunque. La logica dovrebbe entrare nei metodi.

In Java abbiamo qualcosa chiamato Proprietà JavaBeans , ma questa è fondamentalmente una variabile di istanza che segue un certo schema di denominazione per i suoi getter e setter.

In aggiunta a ciò che è stato detto, in una lingua come C #, una proprietà è essenzialmente una funzione get e set. Di conseguenza, può avere una logica personalizzata che viene eseguita oltre all'ottenimento / impostazione. Una variabile di istanza non può farlo.

Una proprietà è una sorta di dati associati a un oggetto. Ad esempio, una proprietà di un cerchio è il suo diametro e un altro è la sua area.

Una variabile di istanza è una porzione di dati archiviata in un oggetto. Non deve necessariamente corrispondere direttamente a una proprietà. Ad esempio (eh), un cerchio può memorizzare il suo raggio in una variabile di istanza e calcolare il diametro e l'area in base a quel raggio. Tutte e tre sono ancora proprietà, ma solo il raggio è memorizzato in una variabile di istanza.

Alcune lingue hanno il concetto di "prima classe" proprietà. Ciò significa che per un'applicazione client, la proprietà ha l'aspetto e viene utilizzata come una variabile di istanza. Cioè, invece di scrivere qualcosa come circle.getDiameter () , dovresti scrivere circle.diameter e invece di circle.setRadius (5) , dovresti scrivere circle.radius = 5 .

Contrariamente alle altre risposte fornite, penso che vi sia un'utile distinzione tra variabili membro e proprietà che è indipendente dalla lingua.

La distinzione è più evidente nella programmazione orientata ai componenti, che è utile ovunque, ma più facile da capire in un'interfaccia grafica. In quel contesto, tendo a pensare alla configurazione in fase di progettazione di un componente come a manipolare le "proprietà" di un oggetto. Ad esempio, scelgo i colori di primo piano e di sfondo, lo stile del bordo e il carattere di un campo di immissione testo impostandone le proprietà. Sebbene queste proprietà possano essere modificate in fase di esecuzione, in genere non lo sono. In fase di esecuzione, è molto più probabile che vengano letti e scritti diversi set di variabili, che rappresentano il contenuto del campo. Penso a queste informazioni come allo "stato" del componente.

Perché questa distinzione è utile? Quando si crea un'astrazione per il cablaggio di componenti insieme, di solito solo lo "stato" le variabili devono essere esposte. Tornando all'esempio del campo di testo, potresti dichiarare un'interfaccia che fornisce l'accesso al contenuto corrente. Ma le "proprietà" che controllano l'aspetto del componente sono definiti solo su una classe di implementazione concreta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top