
Eliminare un attributo di classe in Python
Per eliminare un attributo di classe, puoi utilizzare il comando `del` seguito dal nome della classe e dell'attributo.
del nomeAttributo
Questo comando rimuove l'attributo di classe dal dizionario della classe, rendendolo inaccessibile tramite la classe stessa o tramite le sue istanze, a meno che non sia stato sovrascritto a livello di istanza.
L'eliminazione di un attributo di classe in Python può avere ripercussioni significative sul comportamento delle istanze della classe, perché è condiviso in tutte le istanze.
Fai attenzione quando cancelli un attributo di classe. Un attributo di classe è una variabile definita all'interno di una classe ma al di fuori dai suoi metodi ed è condivisa tra tutte le istanze. Quindi, se lo cancelli, la modifica si ripercuote automaticamente su tutte le istanze che hai già creato con quella classe. L'attributo di classe non sarà più visibile in nessuna istanza esistente.
Ecco un esempio pratico.
Definisci questa semplice classe.
class Car:
wheels = 4 # Attributo di classe
Nella classe c'è un attributo di classe 'wheels'
Ora crea alcune istanze usando la classe 'Car'
myCar1 = Car
myCar2 = Car
Se interroghi l'attributo di classe su ogni istanza, myCar1 o myCar2, ottieni come risposta 4
print(myCar1.wheels)
4
Puoi accedere all'attributo di classe anche direttamente dalla classe 'Car'
print(Car.wheels)
4
Adesso cancella l'attributo di classe 'wheels' utilizzando l'istruzione del.
del Car.wheels
Dopo aver eliminato l'attributo `wheels`, se tenti di accedere a `Car.wheels` tramite la classe, Python solleva un errore `AttributeError` perché non trova più l'attributo nel dizionario della classe.
print(Car.wheels)
AttributeError: type object 'Car' has no attribute 'wheels'
Lo stesso errore viene sollevato se tenti di accedere all'attributo di classe tramite una qualsiasi istanza esistente della classe.
Ad esempio, se provi ad accedere a myCar1.wheels, Python solleva ancora un errore `AttributeError`
print(myCar1.wheels)
AttributeError: type object 'Car' has no attribute 'wheels'
Questo accade perché l'attributo di classe è condiviso da tutte le istanze.
Una volta eliminato un attributo di classe, non sarà più accessibile né dalla classe stessa né dalle sue istanze, a meno che non sia stato esplicitamente sovrascritto nelle istanze individuali.
Come sovrascrivere l'attributo di classe con un attributo di istanza. Se le istanze dipendono dall'attributo di classe per il loro funzionamento, considera di aggiungere un attributo di istanza equivalente prima di eliminare l'attributo di classe. Ad esempio, definisci questa classe:
class Car:
wheels = 4 # attributo di classe
def __init__(self, wheels=None):
if wheels is not None:
self.wheels = wheels # attributo di istanza
myCar1=Car(4)
myCar2=Car()
del Car.wheels
print(myCar1.wheels)
4
In questa classe il costruttore esegue un controllo per determinare se l'argomento 'wheels' è stato specificato al momento della creazione dell'istanza. Se l'argomento è presente, l'istanza sostituirà l'attributo di classe 'wheels' con un proprio attributo di istanza personalizzato. In assenza dell'argomento, invece, l'istanza continuerà a fare riferimento all'attributo di classe. Di conseguenza, le istanze come myCar1, che hanno sostituito l'attributo di classe con il loro attributo di istanza personalizzato, manterranno questo valore personalizzato, anche nel caso in cui l'attributo di classe 'wheels' venga eliminato. Viceversa, le altre istanze come myCar2 perderanno l'attributo di classe.
In conclusione, eliminare un attributo di classe è una decisione che non deve essere presa alla leggera, poiché influisce su tutte le istanze della classe.
Prima di procedere, valuta l'impatto potenziale e modifica adeguatamente il codice per gestire il comportamento delle istanze, in modo da renderlo più robusto e privo di errori inaspettati.