Python - Classi e Oggetti

Ciao a tutti, aspiranti programmatori Python! Oggi ci imbarqueremo in un viaggio avventuroso nel mondo della Programmazione Orientata agli Oggetti (OOP) in Python. Allacciati la cintura, perché stiamo per trasformare il tuo modo di pensare al codice!

Python - Classes & Objects

Cos'è una Classe in Python?

Immagina di costruire un virtuale zoo. Non creeresti ogni animale da zero, giusto? Ecco dove le classi diventano utili!

Una classe in Python è come un progetto o un modello per creare oggetti. Definisce un set di attributi e metodi che gli oggetti di quella classe avranno.

Creiamo una semplice classe per rappresentare un cane:

class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed

def bark(self):
print(f"{self.name} dice Woof!")

In questo esempio, Dog è la nostra classe. Ha attributi come name e breed, e un metodo chiamato bark().

Creazione di Classi in Python

Creare una classe è semplice come usare la parola chiave class seguita dal nome della classe. Creiamo una classe Car più dettagliata:

class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer = 0

def drive(self, distance):
self.odometer += distance
print(f"Hanno guidato {distance} miglia. Totale: {self.odometer} miglia")

def honk(self):
print("Beep beep!")

Qui, __init__ è un metodo speciale chiamato costruttore. Viene chiamato quando creiamo un nuovo oggetto di questa classe.

Cos'è un Oggetto?

Se una classe è un progetto, un oggetto è l'effettiva "cosa" creata da quel progetto. È un'istanza specifica di una classe.

Creazione di Oggetti di Classi in Python

Creare un oggetto (chiamato anche istanziare) è come usare il nostro progetto per creare qualcosa di reale. Creiamo alcune macchine:

my_car = Car("Toyota", "Corolla", 2020)
your_car = Car("Honda", "Civic", 2019)

print(my_car.make)  # Output: Toyota
your_car.drive(50)  # Output: Hanno guidato 50 miglia. Totale: 50 miglia
my_car.honk()  # Output: Beep beep!

Ogni macchina è un oggetto separato con il proprio set di attributi e metodi.

Accesso agli Attributi degli Oggetti in Python

Possiamo accedere agli attributi di un oggetto usando la notazione con il punto. Esaminiamo la nostra macchina:

print(f"La mia macchina è una {my_car.year} {my_car.make} {my_car.model}")
# Output: La mia macchina è una 2020 Toyota Corolla

Attributi di Classe Integrati in Python

Le classi di Python sono dotate di alcuni attributi integrati. Esploriamoli:

class MyClass:
x = 5

print(MyClass.__name__)  # Output: MyClass
print(MyClass.__module__)  # Output: __main__
print(MyClass.__dict__)  # Output: {'__module__': '__main__', 'x': 5, ...}

Classe Integrata dei Tipi di Dati di Python

Sai che anche i tipi di dati di base di Python sono oggetti? Controlliamo:

print(type(5))  # Output: <class 'int'>
print(type("Ciao"))  # Output: <class 'str'>
print(type([1, 2, 3]))  # Output: <class 'list'>

Tutto in Python è un oggetto!

Raccolta dei Rifiuti (Distruzione degli Oggetti) in Python

In Python, non è necessario distruggere manualmente gli oggetti. Il garbage collector di Python si prende cura di questo automaticamente quando un oggetto non è più in uso.

import gc

# Creare un oggetto
my_car = Car("Toyota", "Corolla", 2020)

# Rimuovere il riferimento
my_car = None

# Forzare la raccolta dei rifiuti (di solito non necessario)
gc.collect()

Nascondimento dei Dati in Python

Nella OOP, spesso vogliamo controllare l'accesso a certi attributi. Python utilizza la convenzione di anteporre gli attributi con underscores:

class BankAccount:
def __init__(self, balance):
self._balance = balance  # Attributo protetto
self.__secret = "shh"  # Attributo privato

def deposit(self, amount):
self._balance += amount

def get_balance(self):
return self._balance

account = BankAccount(1000)
print(account._balance)  # Output: 1000 (ma non dovremmo farlo!)
print(account.__secret)  # Questo solleverà un AttributeError

Ecco una tabella che riassume i metodi che abbiamo coperto:

Metodo Descrizione
__init__(self, ...) Metodo costruttore, chiamato quando si crea un nuovo oggetto
__str__(self) Restituisce una rappresentazione stringa dell'oggetto
__repr__(self) Restituisce una rappresentazione dettagliata stringa dell'oggetto
__len__(self) Definisce il comportamento per la funzione integrata len()
__getitem__(self, key) Definisce il comportamento per le operazioni di indicizzazione
__setitem__(self, key, value) Definisce il comportamento per l'assegnazione dei valori indicizzati

Eccoci qui! Hai appena fatto i tuoi primi passi nel mondo della Programmazione Orientata agli Oggetti in Python. Ricorda, la pratica fa il maestro. Prova a creare le tue classi e oggetti, e presto sarai in grado di costruire programmi complessi ed efficienti come un professionista!

Credits: Image by storyset