Basi di programmazione ad oggetti
Python supporta molti paradigmi di programamazione, che caratterizzano lo stile del codice. Il paradigma basato sulle funzioni è conosciuto come Programmazione Procedurale (Procedural Programming) (le funzioni vengono anche chiamate procedure). Un’altro paradigma di programmazione molto utilizzato è la Programmazione Orientata agli Oggetti (Object Oriented Programming – OOP).
L’elemento centrale della programmazione ad oggetti sono (sorpresa sorpresa) gli oggetti, che ci permettono di racchiudere funzioni e variabili all’interno di un’unica entità e rendono il codice maggiormente riutilizzabile e più semplice da mantenere.
Per creare un oggetto dobbiamo definire una classe che lo rappresenterà, le funzioni definite all’interno della classe sono chiamati metodi della classe.
Ad esempio, creiamo una classe che rappresenterà un triangolo, i cui metodi ci permettono di calcolarne area e perimetro.
class Triangle:
def area(self, b, h):
return b*h/2.
def perimeter(self, a, b, c):
return a+b+c
# istanziamo la classe (creiamo l'oggetto)
triangle = Triangle()
print("Area del triangolo: %2.f" % triangle.area(3.,4.))
print("Perimetro del triangolo: %2.f" % triangle.perimeter(5.,3.,5.))
Come puoi vedere ogni metodo della classe ha come primo parametro self, questo ci permette di identificare attributi e metodi all’interno della classe stessa. Alla riga 10 creiamo l’oggetto, che a livello concettuale è un’istanza della classe triangolo. Per calcolare area e perimetro dobbiamo passare di volta in volta le informazioni sulle misure di base, altezze e lati del triangolo, che funziona ma è concettualmente sbagliato, un’oggetto deve contenere le proprie informazioni al suo interno, in apposite variabili chiamate attributi.
Possiamo definire gli attributi della classe all’interno di un metodo costruttore che in Python è l‘init.
Class Triangle: def __init__(self, a, b, c, h): # Questa istruzione è equivalente a quella sotto #self.a, self.b, self.c, self.h = a, b, c ,h self.a = a self.b = b self.c = c self.h = h def area(self): return self.b*self.h/2 def perimeter(self): return self.a+self.b+self.c triangle = Triangle(5.,3.,5.,4.) print("Area del triangolo: %2.f" % triangle.area()) print("Perimetro del triangolo: %2.f" % triangle.perimeter())
Ogni metodo può accedere agli attributi della classe utilizzando self, lo stesso discorso vale per l’utilizzo di metodi all’interno di altri metodi.
class Triangle:
def __init__(self, a, b, c, h):
self.a, self.b, self.c, self.h = a, b, c ,h
def area(self):
return float(self.b)*float(self.h)/2.
def perimeter(self):
return self.a+self.b+self.c
def print_info(self):
print("Area del triangolo: %2.f" % self.area())
print("Perimetro del triangolo: %2.f" % self.perimeter())
triangle = Triangle(5.,3.,5.,4.)
triangle.print_info()
Le classi possono essere organizzate in moduli, cioè file python esterni a quello sulla quale stiamo lavorando (parleremo di questo argomento sotto), in ogni caso possiamo vedere metodi e attributi di una classe usando la funzione help.
class Triangle:
def __init__(self, a, b, c, h):
self.a, self.b, self.c, self.h = a, b, c ,h
def area(self):
return float(self.b)*float(self.h)/2.
def perimeter(self):
return self.a+self.b+self.c
def print_info(self):
print("Area del triangolo: %2.f" % self.area())
print("Perimetro del triangolo: %2.f" % self.perimeter())
triangle = Triangle(5.,3.,5.,4.)
help(triangle)
Una classe può contenere molti metodi differenti, possiamo utilizzare le Docstrings per documentare a cosa serve una classe e cosa fanno ognuno dei suoi metodi:
class Triangle:
"""
Questa classe rappresenta un triangolo
"""
def __init__(self, a, b, c, h):
self.a, self.b, self.c, self.h = a, b, c ,h
def area(self):
"""
Calcolo dell'area del triangolo
"""
return float(self.b)*float(self.h)/2.
def perimeter(self):
"""
Calcolo del perimetro del triangolo
"""
return self.a+self.b+self.c
def print_info(self):
"""
Stampiamo area e perimetro del triangolo
"""
print("Area del triangolo: %2.f" % self.area())
print("Perimetro del triangolo: %2.f" % self.perimeter())
triangle = Triangle(5.,3.,5.,4.)
help(triangle)
I moduli
I moduli ci permettono di organizzare il codice dei nostri programmi in più file, separandone le parti e garantendo una riutilizzabilità ottimale del codice.
Nella pratica, un modulo non è altro che uno script python (.py), con dentro definite delle classi o delle funzioni, possiamo utilizzare tali classi o tali funzioni all’interno di un’altro script python utilizzando import
NOTA BENE i due script devono trovarsi all’interno della stessa directory.
import script
print(type(script))
script.hello_world()
Come vedi possiamo eseguire una funzione contenuta in un modulo possiamo usare una sintassi del tipo nome_modulo.nome_funzione()
Il discorso è uguale per le classi
import geometry
triangle = geometry.Triangle(3., 5., 4., 6.)
print("L'area del triangolo è %.2f" % triangle.area())
square = geometry.Square(5.)
print("L'area del quadrato è %.2f" % square.area())
rectangle = geometry.Rectangle(5.,4.)
print("L'area del rettangolo è %.2f" % rectangle.area())
Possiamo anche decidere di importare solo le funzioni o classi che ci servono utilizzando una sintessi del tipo from modulo import function se vogliamo importare più classi o funzioni basta separarle da una virgola.
from geometry import Triangle
triangle = Triangle(3., 5., 4., 6.)
print("L'area del triangolo è %.2f" % triangle.area())
from geometry import Square, Rectangle
square = Square(5.)
print("L'area del quadrato è %.2f" % square.area())
rectangle = Rectangle(5.,4.)
print("L'area del rettangolo è %.2f" % rectangle.area())
(455)
Altri articoli nella categoria "Lezioni di Informatica"
- Break-Even Point nel Franchising: Calcolo Avanzato, Automazione e Royalty (con Modelli in Python)
- Regressione lineare: esercizi progressivi dai minimi quadrati alla regressione multipla
- Microeconomia applicata: choke price, domanda esponenziale, segmentazione e prezzo ottimale – Parte 2
- Microeconomia applicata: choke price, prezzo di riserva massimo e prezzo ottimale
- Quanti Centri Ha una Figura Geometrica? Dal Baricentro al Pentagramma
- Microeconomia Computazionale: Come la Domanda di Mercato Emerge dai Comportamenti Individuali
- Legge di Benford e Data Quality nel Marketing: Guida, Formule ed Esercizi Python
- Microeconomia dell’AI: 6 esercizi matematici su costi, pricing, domanda ed elasticità
- Equazioni trascendenti: come risolverle con Python, dal punto fisso a Newton e Brent
- Equazioni Omogenee Esponenziali: Guida Pratica con Esercizi Svolti e Applicazioni