AD

Introduzione alle classi in Python

Una classe in Python è un costrutto fondamentale della programmazione ad oggetti (Object-Oriented Programming, OOP). Rappresenta un modello, o blueprint, per creare oggetti. Una classe definisce un insieme di attributi e metodi che caratterizzano qualsiasi oggetto creato da essa. Gli attributi sono variabili che descrivono lo stato degli oggetti, mentre i metodi sono funzioni che definiscono il comportamento degli oggetti.

Creazione di una classe in Python

Per creare una classe in Python, si utilizza la parola chiave class seguita dal nome della classe e due punti. Di seguito è riportato un esempio di una semplice classe Persona:

class Persona: pass

In questo esempio, Persona è una classe vuota. Ora aggiungiamo degli attributi e metodi per rendere la classe più utile.

Attributi di classe e di istanza

Gli attributi di classe sono variabili che sono condivise da tutte le istanze della classe, mentre gli attributi di istanza sono specifici di ciascuna istanza. Gli attributi di istanza sono definiti all'interno di un metodo speciale chiamato init.

Il metodo init è il costruttore della classe in Python. Viene chiamato automaticamente quando si crea un nuovo oggetto della classe. Ecco come si definiscono gli attributi di istanza:

class Persona: def init(self, nome, età): self.nome = nome self.età = età

In questo esempio, nome ed età sono attributi di istanza. Quando si crea un nuovo oggetto Persona, si passa il valore per nome ed età:

persona1 = Persona("Luca", 30) print(persona1.nome)  # Output: Luca print(persona1.età)   # Output: 30

Mentre, gli attributi di classe sono definiti all'interno della classe ma al di fuori di qualsiasi metodo. Sono condivisi tra tutte le istanze della classe:

class Persona: specie = "Homo sapiens"  # Attributo di classe def init(self, nome, età): self.nome = nome self.età = età

È possibile accedere agli attributi di classe tramite il nome della classe o tramite un'istanza:

print(Persona.specie)    # Output: Homo sapiens print(persona1.specie)   # Output: Homo sapiens

Metodi di classe

I metodi di classe sono funzioni definite all'interno di una classe che descrivono i comportamenti degli oggetti. Questi metodi operano sugli attributi di istanza o di classe.

I metodi di istanza operano sugli attributi di istanza. Devono avere self come primo parametro, che rappresenta l'istanza stessa:

class Persona: def init(self, nome, età): self.nome = nome self.età = età def saluta(self): return f"Ciao, mi chiamo {self.nome} e ho {self.età} anni."

È possibile chiamare un metodo di istanza tramite un oggetto della classe:

print(persona1.saluta())  # Output: Ciao, mi chiamo Luca e ho 30 anni.

I metodi di classe utilizzano il decoratore @classmethod e ricevono la classe come primo parametro, convenzionalmente chiamato cls:

class Persona: specie = "Homo sapiens" def init(self, nome, età): self.nome = nome self.età = età @classmethod def descrizione(cls): return f"Tutti gli esseri umani appartengono alla specie {cls.specie}."

I metodi statici utilizzano il decoratore @staticmethod e non ricevono né la classe né l'istanza come parametro. Sono utili per funzioni che non dipendono né dagli attributi di istanza né da quelli di classe:

class Persona: @staticmethod def info_generale(): return "Gli esseri umani hanno bisogno di cibo e acqua per sopravvivere."

Ereditarietà

L'ereditarietà è un meccanismo per creare una nuova classe basata su una classe esistente. La nuova classe (classe derivata) eredita gli attributi e i metodi della classe esistente (classe base). In Python, l'ereditarietà si implementa specificando la classe base tra parentesi dopo il nome della classe derivata:

class Studente(Persona): def init(self, nome, età, matricola): super().__init__(nome, età) self.matricola = matricola

In questo esempio, Studente eredita da Persona e aggiunge un nuovo attributo matricola.

Incapsulamento

L'incapsulamento nasconde i dettagli interni di un oggetto e consente di accedere e modificare gli attributi solo attraverso metodi specifici. In Python, si possono definire attributi privati prefissandoli con due underscore (__):

class ContoBancario: def init(self, saldo_iniziale): self.__saldo = saldo_iniziale  # Attributo privato def deposita(self, importo): self.__saldo += importo def preleva(self, importo): if importo <= self.__saldo: self.__saldo -= importo else: print("Saldo insufficiente") def get_saldo(self): return self.__saldo

Polimorfismo

Il polimorfismo consente di utilizzare metodi di classe con lo stesso nome in classi diverse. In Python, ciò può essere realizzato attraverso l'override dei metodi:

class Animale: def parla(self): pass class Cane(Animale): def parla(self): return "Bau" class Gatto(Animale): def parla(self): return "Miao"

Conclusione

Le classi in Python sono uno strumento potente per la programmazione ad oggetti. Comprendere come creare classi, definire attributi e metodi, utilizzare l'ereditarietà, l'incapsulamento e il polimorfismo è essenziale per scrivere codice pulito, modulare e manutenibile.