Introduzione agli oggetti in Python
In Python, un oggetto è una singola istanza di una classe che incapsula dati (attributi) e comportamenti (metodi). Gli oggetti rappresentano entità concrete del mondo reale all'interno del codice e permettono una programmazione più modulare e intuitiva.
La programmazione orientata agli oggetti (OOP) è un paradigma che utilizza gli oggetti come unità fondamentali di progettazione del software.
Creazione e utilizzo degli oggetti in Python
Per creare un oggetto in Python, è necessario prima definire una classe. La classe funge da blueprint, descrivendo la struttura e il comportamento degli oggetti che verranno creati da essa. Ecco un esempio di come definire una classe Persona:
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."
Una volta definita la classe, è possibile creare oggetti chiamando la classe come se fosse una funzione. Questo processo è noto come "istanziazione":
persona1 = Persona("Luca", 30)
Gli attributi e i metodi di un oggetto si accedono utilizzando il punto (.):
print(persona1.nome) # Output: Luca
print(persona1.età) # Output: 30
print(persona1.saluta()) # Output: Ciao, mi chiamo Luca e ho 30 anni.
Gli attributi sono variabili associate a un oggetto. Possono essere di due tipi: attributi di istanza e attributi di classe.
Gli attributi di istanza sono specifici di ciascuna istanza di una classe. Sono definiti all'interno del metodo init, il costruttore della classe:
class Studente: def init(self, nome, matricola): self.nome = nome self.matricola = matricolaGli attributi di classe sono condivisi tra tutte le istanze di una classe. Sono definiti direttamente all'interno della classe:
class Studente: scuola = "Liceo Scientifico" # Attributo di classe def init(self, nome, matricola): self.nome = nome self.matricola = matricola
Metodi degli oggetti
I metodi sono funzioni definite all'interno di una classe che descrivono i comportamenti degli oggetti. Possono essere di tre tipi principali: metodi di istanza, metodi di classe e metodi statici.
I metodi di istanza operano sugli attributi di istanza e devono avere self come primo parametro:
class Studente: def init(self, nome, matricola): self.nome = nome self.matricola = matricola def descrizione(self): return f"Studente {self.nome}, Matricola {self.matricola}"I metodi di classe operano sugli attributi di classe e utilizzano il decoratore @classmethod. Ricevono la classe come primo parametro, convenzionalmente chiamato cls:
class Studente: scuola = "Liceo Scientifico" @classmethod def cambia_scuola(cls, nuova_scuola): cls.scuola = nuova_scuolaI metodi statici non operano né sugli attributi di istanza né su quelli di classe. Utilizzano il decoratore @staticmethod e non ricevono alcun parametro aggiuntivo:
class Studente: @staticmethod def info_generale(): return "Gli studenti studiano varie materie."
Ereditarietà e oggetti
L'ereditarietà permette di creare una nuova classe che eredita attributi e metodi da una classe esistente. Questo facilita il riutilizzo del codice e la creazione di gerarchie di classi.
Una classe derivata eredita da una classe base specificata tra parentesi dopo il nome della classe derivata:
class Persona:
def init(self, nome, età):
self.nome = nome
self.età = età
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 è il processo di nascondere i dettagli interni di un oggetto e di esporre solo ciò che è necessario. In Python, gli attributi privati possono essere definiti con un doppio underscore (__):
class ContoBancario:
def init(self, saldo_iniziale):
self.__saldo = saldo_iniziale
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
Vantaggi degli oggetti in Python
Modularità: Gli oggetti permettono di suddividere il codice in unità più piccole e gestibili.
Riutilizzabilità: Le classi possono essere riutilizzate in diversi contesti, riducendo la duplicazione del codice.
Manutenibilità: La struttura ad oggetti rende più facile isolare e correggere gli errori.
Scalabilità: Le applicazioni possono crescere in complessità senza diventare ingestibili grazie alla modularità.
Conclusione
Gli oggetti sono il cuore della programmazione orientata agli oggetti in Python. Comprendere come creare e utilizzare oggetti, definire attributi e metodi, sfruttare l'ereditarietà e il polimorfismo, e applicare l'incapsulamento è essenziale per scrivere codice pulito, modulare e manutenibile.