# Le variabili di classe in Python: come crearle e utilizzarle

Le variabili di classe in Python costituiscono una possibilità strutturata per suddividere i dati fra diverse istanze di una classe. Inoltre, le **modifiche apportate a una variabile di classe** hanno effetto su tutte le istanze della classe. In questo modo non è necessario ridefinirle da zero a ogni istanziazione.

## Che cosa sono le variabili di classe in Python?

All’interno di una classe in Python è possibile creare delle variabili di classe. A differenza delle variabili di istanza, che sono specifiche per ciascuna istanza di una classe, **le variabili di classe mantengono lo stesso valore per tutte le istanze**. Di norma, queste variabili sono definite prima del costruttore e sono accessibili da parte di tutte le istanze della classe.

Le variabili di classe in Python sono utilizzate spesso per **memorizzare informazioni** in comune a tutte le istanze di una classe, come ad esempio i valori di configurazione, i valori standard o condizioni comuni all’interno di una gerarchia di classi. Inoltre, è possibile utilizzare le variabili di classe per definire metodi o attributi condivisi da tutte le istanze di una classe e migliorare quindi la funzionalità e l’organizzazione del codice.

## La sintassi delle variabili di classe in Python

Le variabili di classe in Python vengono create **all’interno della definizione di classe** e al di fuori dei metodi.

```python
class Car:
    total_cars = 0  # Class variable to track the total number of cars
    def __init__(self, brand, model):
        self.brand = brand  # Instance variable for the car brand
        self.model = model  # Instance variable for the car model
        Car.total_cars += 1  # Increment the total number of cars upon each instantiation
    def display_details(self):
        print(f"Brand: {self.brand}, Model: {self.model}")
# Creating instances of Car
car1 = Car("BMW", "X3")
car2 = Car("Audi", "A4")
# Accessing class variable and instance variables
print(f"Total number of cars: {Car.total_cars}")  # Output: 2
car1.display_details()  # Output: Brand: BMW, Model: X3
car2.display_details()  # Output: Brand: Audi, Model: A4
```

All’interno della classe `Car` definiamo la variabile di classe `total_cars` per seguire il numero totale di auto. Il costruttore `__init__` viene richiamato quando viene generata una nuova istanza della classe. A ogni istanziazione, vengono impostate le **variabili di istanza** `brand` e `model`, mentre la variabile di classe `total_cars` viene incrementata di 1.

Richiamando il metodo `display_details()` otteniamo i dettagli delle rispettive istanze auto. In una **f-string**, ossia un metodo di [formattazione delle stringhe in Python](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/formattazione-delle-stringhe-in-python/), possiamo accedere alla variabile di classe `total_cars` per visualizzare il numero totale delle auto prodotte.

## Esempi di applicazione delle variabili di classe in Python

Per un utilizzo sicuro delle variabili di classe in Python sono importanti soprattutto l’accesso, la modifica e l’ereditarietà.

### Accesso alle variabili di classe

L’accesso alle variabili di classe in Python avviene **tramite il nome della classe o l’istanza**, seguiti da un punto e dal nome della variabile.

```python
class MyClass:
    class_var = "This is a class variable"
# using class name to access class variable
print(MyClass.class_var)  # Output: This is a class variable
# using instance to access class variable
obj = MyClass()
print(obj.class_var)  # Output: This is a class variable
```

In Python è possibile richiamare le variabili di classe in diversi punti:

- **Nel costruttore**: la variabile di classe può essere richiamata all’interno del costruttore per mezzo della parola chiave `self` oppure con il nome della classe.
- **In metodi istanza**: per richiamare la variabile di classe all’interno di metodi istanza si utilizza la parola chiave `self` oppure il nome della classe.
- **All’esterno della classe**: è possibile accedere alla variabile di classe all’esterno della classe tramite il riferimento oggetto oppure con il nome della classe.

### Modifica delle variabili di classe

Per modificare le variabili di classe in Python puoi utilizzare direttamente il nome della classe. Se però una variabile di istanza ha lo stesso nome di una variabile di classe e provi a modificarla tramite l’istanza, viene **creata una nuova variabile di istanza** e la variabile di classe rimane inalterata.

```python
class MyClass:
    class_var = "Original class variable"
obj = MyClass()
print(obj.class_var)  # Output: Original class variable
MyClass.class_var = "Modified class variable"
print(obj.class_var)  # Output: Modified class variable
```

In questo esempio sovrascriviamo la variabile di classe `class_var` assegnando un nuovo valore tramite la classe `MyClass`. La modifica viene acquisita automaticamente dall’istanza `obj`.

### Variabili di classe ed ereditarietà

L’ereditarietà consente alle classi derivate di **accedere alle variabili di classe della classe base** e di utilizzarle senza doverle ridefinire nuovamente.

```python
class BaseClass:
    base_var = "Base variable"
class DerivedClass(BaseClass):
    pass
print(DerivedClass.base_var)  # Output: Base variable
```

Qui definiamo una classe base `BaseClass` che contiene la variabile di classe `base_var`. La classe derivata `DerivedClass` eredita da `BaseClass`. Grazie all’ereditarietà, `DerivedClass` può accedere alla variabile di classe `base_var` della classe base e utilizzarla senza ripetere la definizione.


This is a markdown version of: [https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/python-class-variables/](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/python-class-variables/) for AI/LLM consumption.