lettura facile

La funzione super() in Python

La funzione super() in Python ti permette di chiamare gli attributi e i metodi di una classe genitore (superclasse) all'interno di una classe derivata (subclasse).

super()

Questa funzione è particolarmente utile quando lavori con l'ereditarietà e vuoi estendere o modificare il comportamento delle classi genitore.

Perché usare super()? Immagina di avere una serie di classi che condividono alcune funzionalità comuni. Invece di riscrivere lo stesso codice in ogni classe, puoi mettere quel codice in una classe base e poi estenderlo nelle sottoclassi. La funzione super() ti permette di fare riferimento a questi metodi e attributi della classe base senza doverli riscrivere.

Consideriamo un esempio semplice con delle classi che rappresentano dei veicoli.

class Veicolo:
   def __init__(self, marca, modello):
      self.marca = marca
      self.modello = modello

   def descrizione(self):
      return f"{self.marca} {self.modello}"

class Automobile(Veicolo):
    def __init__(self, marca, modello, tipo):
        super().__init__(marca, modello)
        self.tipo = tipo
    def descrizione(self):
         return f"{super().descrizione()} - Tipo: {self.tipo}"

In questo codice la classe `Veicolo` è la nostra classe base con un costruttore (`__init__`) che inizializza la marca e il modello del veicolo. Ha anche un metodo `descrizione` che restituisce una stringa con la marca e il modello.

La classe `Automobile` è, invece, una sottoclasse di `Veicolo`.

  • Nel suo costruttore, chiama il costruttore della superclasse (`super().__init__(marca, modello)`) per inizializzare la marca e il modello, poi aggiunge un attributo specifico `tipo`.
  • Il metodo `descrizione` nella classe `Automobile` estende il metodo `descrizione` della superclasse. Usa `super().descrizione()` per ottenere la descrizione base e aggiunge informazioni specifiche dell'automobile.

In questo modo, quando creiamo un'istanza di `Automobile` e chiamiamo `descrizione`, otteniamo una stringa che combina le informazioni della classe base e della sottoclasse.

Ad esempio crea un'istanza della classe 'Automobile'.

auto = Automobile("Toyota", "Corolla", "Berlina")

Ora chiama il metodo 'descrizione' dall'istanza.

print(auto.descrizione())

Toyota Corolla - Tipo: Berlina

Nota che avresti potuto ottenere gli stessi risultati anche indicando direttamente il nome della classe madre 'Veicolo' anziché usare la funzione super().

class Veicolo:
   def __init__(self, marca, modello):
      self.marca = marca
      self.modello = modello

   def descrizione(self):
      return f"{self.marca} {self.modello}"

class Automobile(Veicolo):
    def __init__(self, marca, modello, tipo):
        Veicolo.__init__(self, marca, modello)
        self.tipo = tipo
    def descrizione(self):
         return f"{Veicolo.descrizione(self)} - Tipo: {self.tipo}"

Tuttavia, la funzione super() offre vantaggi in termini di manutenibilità, compatibilità con l'ereditarietà multipla e supporto del polimorfismo. Per un approfondimento leggi il nostro tutorial sull'ereditarietà multipla nelle classi super.

Quindi, anche se è possibile ottenere gli stessi risultati senza super(), il suo uso rende il codice più robusto e flessibile.

Quali sono i vantaggi della funzione super()?

La funzione super() ti permette di riutilizzare il codice, evitando la duplicazione e questo facilita la manutenzione.

Inoltre, ti consente di estendere le funzionalità delle classi base senza modificarle direttamente.

Facilita l'uso del principio di sostituzione di Liskov, uno dei principi solidi della programmazione orientata agli oggetti, garantendo che le sottoclassi possano sostituire le classi base senza rompere il comportamento del programma.

Quindi, la prossima volta che lavori con classi in Python, ricorda di sfruttare `super()` per ottenere il massimo dalla programmazione a oggetti.

 




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




FacebookTwitterLinkedinLinkedin