AD

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 = matricola
  • Gli 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_scuola
  • I 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.