Classi in OOP, metodi e attributi interni di memoria [chiuso]

4

Suppongo che le istanze della stessa classe condividano effettivamente i loro metodi e abbiano semplicemente salvato diversi attributi nel loro spazio dei nomi. Con quale frequenza aggiungi arbitrariamente metodi a una singola istanza?

Tuttavia, per esempio in Python non è così. I metodi delle istanze sono tutti oggetti diversi. Anche se li decori come @classmethods , (o usa __slots__ ) sembrano essere oggetti diversi nella memoria.

Qualcuno può darmi una definizione di ciò che sto descrivendo qui, o anche dato gli stessi dettagli sul perché è stato scelto questo modello? Cosa succede in altre lingue?

    
posta Serra South 02.04.2014 - 05:10
fonte

3 risposte

5

I termini pertinenti qui sono dinamici e tipizzazione statica .

Con la tipizzazione statica, tutti i tipi sono fissi e non cambiano durante il tempo di esecuzione del programma. Questo è ciò che stanno facendo i linguaggi tradizionali come C / Java / etc. Il vantaggio per i linguaggi compilati con la tipizzazione statica è che sanno che ogni oggetto della classe avrà gli stessi metodi e in quanto tali sono liberi di ottimizzare con questo in mente. In particolare, ogni implementazione del metodo viene memorizzata solo una volta nella memoria e solo gli attributi dell'oggetto vengono memorizzati per ogni singolo oggetto. Per un oggetto, è sufficiente memorizzare un singolo puntatore nella tabella dei metodi della classe.

D'altra parte, linguaggi come Python offrono una digitazione dinamica, in cui un tipo può cambiare durante il runtime. Ad esempio, in Python è possibile aggiungere un metodo a una classe. Una volta che inizi a modificare il tipo, non sei più garantito che una versione compilata dei tuoi metodi sia ancora valida, quindi è più difficile memorizzare questi metodi. Se la tua lingua ti consente persino di aggiungere metodi alla classe di un oggetto per singolo oggetto, allora non possono condividere due tipi di oggetti.

Ci sono ancora molte ottimizzazioni possibili con la digitazione dinamica, ma come regola empirica, le lingue tipizzate staticamente hanno un tempo di ottimizzazione molto più facile, perché hanno molte garanzie riguardo al loro sistema di tipi. D'altra parte, il programmatore è costretto ad aderire al sistema di tipo altrettanto bene, in contrasto con la libertà di un linguaggio tipizzato dinamicamente. Entrambe le parti hanno vantaggi e svantaggi, ma queste sono al di fuori della portata della tua domanda.

    
risposta data 02.04.2014 - 07:07
fonte
2

Anche nei linguaggi che consentono la modifica dinamica di una singola istanza, come Python o Ruby, il codice dei metodi esiste ancora solo una volta nella memoria. La differenza principale tra quei linguaggi e quelli in cui una singola istanza non può essere modificata (come Java o C ++) è quella nei linguaggi statici, ogni istanza concettualmente contiene un riferimento a un elenco di funzioni supportate che è condivisa tra tutte le istanze (in concreto implementazioni questo è spesso chiamato vtable), mentre nei linguaggi dinamici ogni istanza ha bisogno della propria tabella. (Come ottimizzazione, le istanze non modificate potrebbero condividere la tabella e creare solo le proprie versioni quando vengono modificate.)

In entrambi i casi, tuttavia, tali tabelle conterranno riferimenti al codice dei metodi effettivi e tale codice verrà condiviso. A meno che la tua lingua sia così dinamica da poter modificare il codice reale in fase di runtime.

    
risposta data 02.04.2014 - 12:12
fonte
0

I concetti OOP non cambiano se li si confronta in diversi linguaggi di programmazione, sebbene il modo in cui viene implementato possa variare. Ho lavorato su C ++ per 2 anni e prima ancora ho imparato e lavorato in Java.

Ecco come puoi guardarlo.

Le classi sono i progetti basati su quali oggetti sono generati. In altre parole, la classe può essere vista come entità logiche generiche e gli oggetti sono entità fisiche. Ad esempio: la forma è un'entità logica generica e il cerchio è un'entità fisica.

Ogni classe contiene dati e metodi (funzione) per manipolare tali dati. per esempio: la forma ha lunghezza, dimensione ecc. come dati e volume (), Area () ecc. come metodi.

Ora, per quanto ho capito, la tua domanda ti sta chiedendo su come o quando i metodi diventano diversi per oggetti / istanze differenti. (correggimi).

Ora per rispondere dobbiamo capire il polimorfismo che è un concetto di OOP. Il polimorfismo ha due varianti statiche e dinamiche. Il polimorfismo statico viene implementato tramite sovraccarico di funzione / metodo e Il polimorfismo dinamico viene implementato mediante l'override di funzione / metodo.

Collegamento statico: Metodi multipli, stesso nome, stesso ambito, parametri diversi. Viene risolto al momento della compilazione.

Associazione dinamica: Metodi multipli, stesso nome, ambito diverso, stessi parametri. Viene risolto in fase di runtime.

Ora se due istanze (ad esempio O1 O2) funzionano in modo tale da chiamare alla fine metodi diversi tramite associazione statica o associazione dinamica. Ciò significa che l'istanza O1 chiamerà diversi metodi quando la confronti con O2.

Spero che abbia un senso, post dubbio se ce ne sono.

    
risposta data 02.04.2014 - 09:11
fonte