lettura facile

Gli oggetti in Python

Nel linguaggio Python, tutto è un oggetto. Questo significa che ogni elemento del codice, come numeri, stringhe, funzioni, classi, moduli e persino i tipi stessi, sono tutti oggetti.

Cos'è un oggetto? In poche parole, un oggetto è una struttura dati che contiene sia dati (chiamati attributi) che codice (chiamato metodi). Gli oggetti sono creati, o "istanziati", da espressioni nel codice.

Quando crei un oggetto, memorizzi il riferimento all'oggetto in una variabile.

Ad esempio, se scrivi x = 77 crei un oggetto numero intero che contiene il valore 77 e salvi il riferimento a esso nella variabile x.

x=77

In questo modo, puoi usare la variabile x per accedere o modificare l'oggetto in seguito.

Il nome della variabile "x" è semplicemente una etichetta a cui è assegnato il riferimento all'oggetto.

un esempio di assegnazione di un'etichetta a un oggetto

Python memorizza l'oggetto in una zona della memoria. Quindi, nella variabile x non c'è l'oggetto vero e proprio ma solo il "riferimento" ossia il collegamento all'indirizzo di memoria in cui si trova l'oggetto.

Il tipo e l'identità di un oggetto

In Python, ogni oggetto possiede un tipo e un'identità distinti.

Tipo

Il tipo di un oggetto indica il tipo di dato ossia la natura dei dati che esso contiene.

Ogni oggetto in Python ha un apposito attributo utilizzato come descrittore di tipo, in cui viene memorizzato il tipo di dati dell'oggetto.

Per conoscere il tipo di un oggetto, puoi usare la funzione type()

>>> type(x)

Un altro metodo per identificare il tipo di un oggetto è attraverso l'uso dell'attributo class dell'oggetto:

>>> x.__class__

In entrambi i casi, Python restituirà il tipo dell'oggetto, come ad esempio '<class 'int'>' se l'oggetto è la variabile x=7.

<class 'int'>

L'identità

L'identità di un oggetto, invece, corrisponde al suo indirizzo di memoria. Puoi ottenere questo valore utilizzando la funzione id()

>>> id(x)

La funzione id() restituisce un identificativo unico, che corrisponde al numero associato all'indirizzo di memoria in cui l'oggetto è allocato.

140551262192048

In questo modo puoi capire se due variabili fanno riferimento allo stesso oggetto in memoria oppure no.

Puoi verificare se due oggetti hanno lo stesso identificativo tramite l'operatore "is"

x is y

L'operatore restituisce True se hanno lo stesso identificativo oppure False se hanno due identificativi diversi.

x=7
y=8
print(x is y)

In questo caso restituisce False perché gli identificativi degli oggetti "x" e "y" sono diversi

False

Ricorda che due oggetti con identificativi diversi sono considerati distinti. Al contrario, se due oggetti condividono lo stesso identificativo, allora si tratta dello stesso oggetto.

Garbage Collection

Python ha un meccanismo che libera automaticamente la memoria quando un oggetto non è più necessario.

Questo avviene quando non ci sono più riferimenti a un oggetto.

Come funziona la garbage collection? Ogni oggetto ha il proprio contatore dei riferimenti memorizzato in un attributo apposito chiamato "reference count". Quando il contatore dell'oggetto diventa uguale a zero, vuol dire che il programma non lo utilizza più e la garbage collection può liberare lo spazio di memoria che occupa.

Ad esempio, crea un oggetto salvando il riferimento nella variabile x

x=77

Nel nome di variabile (o etichetta) "x" viene salvato il riferimento all'oggetto di tipo intero 77.

L'assegnazione esplicita Sia gli attributi che i metodi sono associati a etichette che valgono solo all'interno dell'oggetto e ti permettono di accedere al loro contenuto. L'etichetta è semplicemente il nome. Ad esempio, l'attributo "mia_auto.colore" ha come etichetta "colore", il metodo "mia_auto.accelera()" ha come etichetta "accelera".x=77 crea un legame tra l'etichetta "x" e l'oggetto 77.

un esempio di assegnazione di un'etichetta a un oggetto

Ora assegna un valore diverso alla stessa variabile

x=10

La nuova assegnazione crea un nuovo legame tra l'etichetta x e un altro oggetto, diverso dal precedente.

Ora nell'etichetta "x" c'è il riferimento a un nuovo oggetto di tipo intero 10.

la nuova assegnazione modifica il riferimento nell'etichetta x

Il riferimento al vecchio oggetto è perso e l'oggetto 77 non ha altri riferimenti verso di sé.

Quindi, la garbage collection elimina l'oggetto "77" dalla memoria in modo sicuro, liberando lo spazio di memoria che occupava.

la garbage collection elimina l'oggetto 77

A cosa serve la garbage collection? Rende più efficiente l'utilizzo della memoria del computer, liberandola dagli oggetti non più necessari. Riduce il rischio di incappare in un errore di "overflow" della memoria, che si verifica quando tutti gli indirizzi di memoria sono già occupati.

Come modificare un oggetto

Gli oggetti non possono essere modificati direttamente tramite assegnazione, poiché questa operazione modifica solo il riferimento tra un'etichetta (nome di variabile) e un oggetto.

Per modificare un oggetto, devi utilizzare i metodi forniti dall'oggetto stesso.

Tuttavia, va notato che non tutti gli oggetti sono modificabili. Ad esempio, le tuple sono oggetti immutabili, mentre le liste sono oggetti mutabili.

Ecco un esempio pratico.

Crea una lista composta da tre valori interi.

lista = [1, 2, 3]

Per aggiungere un valore all'oggetto, puoi utilizzare il metodo append()

lista.append(4)

Questa operazione modifica direttamente l'oggetto senza crearne uno nuovo.

Un altro metodo che modifica l'oggetto è il metodo sort()

lista.sort()

Puoi modificare l'oggetto anche utilizzando l'istruzione "del" che ti consente di rimuovere elementi all'interno dell'oggetto. Ad esempio:

del lista[0:1]

Gli attributi e i metodi di un oggetto

In Python, un oggetto è un'istanza di una classe.

A sua volta una classe è come un modello o un progetto che definisce gli attributi e i metodi che un oggetto può avere.

Attributi (o proprietà)

Gli attributi sono le variabili che appartengono a un oggetto in cui puoi registrare informazioni. Sono anche conosciute come "proprietà".

L'insieme degli attributi determina lo stato dell'oggetto.

Ad esempio, se hai una classe "Auto", gli oggetti creati da questa classe potrebbero avere come attributi il colore, la marca, il modello dell'automobile, ecc.

Ecco un esempio di una classe con alcuni attributi:

  1. class Auto:
  2. def __init__(self, colore, marca, modello):
  3. self.colore = colore
  4. self.marca = marca
  5. self.modello = modello

Una volta definita la classe puoi creare uno o più oggetti istanza della classe Auto

Ad esempio, crea un oggetto e assegnagli come etichetta "mia_auto".

mia_auto = Auto("rosso", "Ferrari", "488 GTB")

L'oggetto eredita tutte le caratteristiche della classe, sia gli attributi che i metodi.

Ad esempio, puoi leggere l'informazione contenuta in ciascun attributo dell'oggetto.

print(mia_auto.colore)

In questo caso Python legge il valore registrato nell'attributo "colore" e stampa "rosso"

rosso

Allo stesso modo puoi leggere gli altri attributi "marca" e "modello" dell'oggetto.

Puoi anche modificare i valori registrati negli attributi.

I metodi

I metodi sono le funzioni che appartengono a un oggetto che definiscono il comportamento dell'oggetto.

Ad esempio, la classe Auto potrebbe avere metodi come accelera(), frena(), sterza(), ecc.

Ecco un esempio di come puoi definire una classe con alcuni metodi:

  1. class Auto:
  2. def __init__(self, colore, marca, modello):
  3. self.colore = colore
  4. self.marca = marca
  5. self.modello = modello
  6. def accelera(self):
  7. print("L'auto sta accelerando.")
  8. def frena(self):
  9. print("L'auto sta frenando.")

Ora crea un oggetto istanza della classe "Auto"

mia_auto = Auto("rosso", "Ferrari", "488 GTB")

L'oggetto eredita gli attributi e i metodi della classe.

A questo punto puoi chiamare ed eseguire i metodi dell'oggetto

mia_auto.accelera()

In questo caso Python esegue il contenuto del metodo accelera()

L'auto sta accelerando.

Allo stesso modo puoi chiamare gli altri metodi dell'oggetto.

In Python, gli attributi e i metodi di un oggetto sono accessibili utilizzando la notazione punto (.). Ad esempio, se hai creato un oggetto "mia_auto" puoi accedere a un attributo dell'oggetto scrivendo il nome dell'oggetto seguito da un punto e dall'etichetta dell'attributo. Ad esempio, "mia_auto.colore". Allo stesso modo puoi accedere ai metodi. Ad esempio. "mia_auto.accelera()".

Sia gli attributi che i metodi sono associati a etichette che valgono solo all'interno dell'oggetto e ti permettono di accedere al loro contenuto. L'etichetta è semplicemente il nome.

Ad esempio, l'attributo "mia_auto.colore" ha come etichetta "colore", il metodo "mia_auto.accelera()" ha come etichetta "accelera".

Per vedere l'elenco delle etichette dei metodi e delle proprietà di un oggetto, puoi usare la funzione dir() indicando tra parentesi il nome dell'oggetto

dir(mia_auto)

La funzione dir ti mostra l'elenco delle etichette dell'oggetto "mia_auto"

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'accelera', 'colore', 'frena', 'marca', 'modello']

Alcune etichette sono predefinite in tutti gli oggetti mentre altre sono quelle che hai usato per definire i metodi e le proprietà di una classe.

Ad esempio, l'etichetta "__class__" è usata per memorizzare il nome della classe "Auto" utilizzata per creare l'oggetto "mia_auto".

Le etichette "accelera", "colore", "frena", "marca", "modello" sono invece quelle dei metodi e degli attributi che abbiamo definito nella classe "Auto".




Se qualcosa non ti è chiaro, scrivi la tua domanda nei commenti.




FacebookTwitterLinkedinLinkedin