HTML.it logo
Learn
  • Design
    • Grafica
    • User Interface Design
    • Adobe Creative Suite
    Guide
    Approfondimenti
    Faq
    Notizie
    Tutto in Design >
  • Development
    • .NET
    • ASP
    • CMS
    • Flash
    • Java
    • JavaScript
    • PHP
    • Essentials
    • Ruby
    • XML
    • Editor
    • CSS
    • HTML
    Guide
    Approfondimenti
    Script
    Faq
    Notizie
    Tutto in Development >
  • Mobile
    • Android Studio
    • Cordova
    • Eclipse
    • Objective C
    • Swift
    Guide
    Approfondimenti
    Script
    Faq
    Notizie
    Tutto in Mobile >
  • Server
    • Cloud
    • Database
    • OS
    • Sicurezza
    • Network
    Tutto in Server >
  • Digital Marketing
    • SEO
    • Affiliate Marketing
    • Social Media Marketing
    Tutto in Digital Marketing >
  • Makers
    • Arduino
    • RaspberryPi
    • Stampa 3D
    Guide
    Approfondimenti
    Notizie
    Tutto in Makers >
  • Game Design
    • Unity
    Guide
    Approfondimenti
    Notizie
    Tutto in Game Design >
Download
  • Audio e Video
    • Player Audio Video
    • Codec audio
    • Editor audio video
    • Masterizzazione
    • Ripper e Convertitori
    • Speech
    Tutto in Audio e Video >
  • Educazione
    • Bambini
    • Cucina
    • Salute e Benessere
    • Istruzione
    Tutto in Educazione >
  • Giochi
    • Arcade
    • Avventura
    • Azione
    • Board
    • Carte
    • Giochi di ruolo
    • Giochi Online
    • Puzzle e Enigmistica
    • Simulazione
    • Sparatutto
    • Sport
    • Strategia e Giochi di Guerra
    • Tempo Libero
    Tutto in Giochi >
  • Grafica
    • Accessori & Mappe
    • Animazione
    • CAD – 3D
    • Cattura schermo
    • Convertitori e ridimensionatori
    • Editor
    • Flash
    • Font
    • Fotoritocco
    • Gallerie e album
    • Icone e loghi
    • Visualizzatori
    Tutto in Grafica >
  • Internet
    • Browser
    • Chat e IM
    • eMail
    • Estensioni & Temi
    • FTP
    • Network
    • News e RSS
    • Peer to Peer
    • Webcam
    Tutto in Internet >
  • Programmazione
    • Accessori
    • CMS e E-Commerce
    • Editor e Compilatori
    • Editor e strumenti Web
    • Linguaggi
    Tutto in Programmazione >
  • Sicurezza
    • Antispam
    • Antispyware
    • Antivirus
    • Server
    Tutto in Sicurezza >
  • Produttività
    • Backup
    • Compressione
    • Connettività
    • Database
    • Fax e Telefonia
    • Gestione disco
    • Ottimizzazione
    • Ufficio
    • Utilità di Sistema
    Tutto in Produttività >
Notizie
Video
Forum
in  
Trend
JavaScriptPHPHTMLLinguaggio CPythonDigital MarketingProgrammazioneWordPressJavaGame Design
INDICE DELLA GUIDA
Primi passi con il linguaggio
  1. 1 Introduzione e un po' di storia

  2. 2 Perché usare Python

  3. 3 Installare Python

  4. 4 L'interprete Python e l'IDLE

  5. 5 Le funzioni print e input

  6. 6 Indentazione

Variabili e tipi di dati
  1. 7 Variabili e commenti in Python

  2. 8 Numeri e operatori logici in Python

  3. 9 Stringhe in Python

  4. 10 Tuple

  5. 11 Liste

  6. 12 Dizionari

  7. 13 Set e frozenset

  8. 14 Tipi built-in: riepilogo

La programmazione con Python
  1. 15 Istruzioni Condizionali

  2. 16 Cicli: for e while

  3. 17 List/Set/Dict Comprehension

  4. 18 Funzioni

  5. 19 Gestione delle eccezioni

  6. 20 Gestire i file

  7. 21 Moduli

  8. 22 Creare nuovi moduli

  9. 23 Package

La programmazione a oggetti con Python
  1. lezione
    24 di 40

    La programmazione ad oggetti

  2. 25 Classi in Python

  3. 26 Ereditarietà

  4. 27 Metodi speciali

  5. 28 Overloading degli operatori

GUI con Python
  1. 29 GUI sui Python: i Framework da usare

  2. 30 Tkinter

  3. 31 PyQt

  4. 32 Kivy

Approfondimenti
  1. 33 Python e Java

  2. 34 Python e i database

  3. 35 Python e cgi

  4. 36 Multithreading

  5. 37 File JSON: leggere e scrivere

  6. 38 File XML: leggere e scrivere

  7. 39 Future statement

  8. 40 pip: il package manager per Python

  • Learn
  • Guida Python
  • La programmazione ad oggetti
lezione
24 di 40

La programmazione ad oggetti

  • di Ezio Melotti
  • 20 Novembre 2017

In uno dei capitoli introduttivi di questa guida abbiamo visto che Python è un linguaggio multi-paradigma, che supporta cioè sia la programmazione procedurale (che fa uso delle funzioni), sia la programmazione funzionale (includendo iteratori e generatori), sia la programmazione ad oggetti (includendo funzionalità come l’ereditarietà singola e multipla, l’overloading degli operatori, e il duck typing).

In questo capitolo introdurremo i concetti della programmazione orientata agli oggetti, e vedremo alcuni semplici esempi. Nei capitoli successivi vedremo più in dettaglio come usare gli oggetti in Python, la sintassi necessaria per crearli, e le operazioni che supportano.

Gli oggetti

Mentre nella programmazione procedurale le funzioni (o procedure) sono l’elemento organizzativo principale, nella programmazione ad oggetti (anche conosciuta come OOP, ovvero object-Oriented Programming) l’elemento organizzativo principale sono gli oggetti.

Nella programmazione procedurale, i dati e le funzioni sono separate, e questo può creare una serie di problemi, tra cui:

  • è necessario gestire dati e funzioni separatamente;
  • è necessario importare le funzioni che vogliamo usare;
  • è necessario passare i dati alle funzioni;
  • è necessario verificare che i dati e le funzioni siano compatibili;
  • è più difficile estendere e modificare le funzionalità;
  • il codice è più difficile da mantenere;
  • è più facile introdurre bug.

Nella programmazione ad oggetti, gli oggetti svolgono la funzione di racchiudere in un’unica unità organizzativa sia i dati che il comportamento. Questo ha diversi vantaggi:

  • dati e funzioni sono raggruppati;
  • è facile sapere quali operazioni possono essere eseguite sui dati;
  • non è necessario importare funzioni per eseguire queste operazioni;
  • non è necessario passare i dati alle funzioni;
  • le funzioni sono compatibili con i dati;
  • è più facile estendere e modificare le funzionalità;
  • il codice è più semplice da mantenere;
  • è più difficile introdurre bug.

Vediamo un semplice esempio: abbiamo la base e l’altezza di 100 diversi rettangoli e vogliamo sapere area e perimetro di ogni rettangolo. Usando un approccio procedurale, possiamo risolvere il problema creando due funzioni separate che accettano base e altezza:


>>> # definiamo due funzioni per calcolare area e perimetro
>>> def calc_rectangle_area(base, height):
...     """Calculate and return the area of a rectangle."""
...     return base * height
...
>>> def calc_rectangle_perimeter(base, height):
...     """Calculate and return the perimeter of a rectangle."""
...     return (base + height) * 2
...

Possiamo poi creare una lista di tuple casuali (base, altezza), iterarla con un for e passare i valori alle funzioni:


>>> from random import randrange
>>> # creiamo una lista di 100 tuple (base, altezza) con valori casuali
>>> rects = [(randrange(100), randrange(100)) for x in range(100)]
>>> rects
[(16, 39), (92, 96), (60, 72), (99, 32), (39, 5), (43, 6), (51, 28), ...]
>>> # iteriamo la lista di rettangoli e printiamo
>>> # base, altezza, area, perimetro di ogni rettangolo
>>> for base, height in rects:
...     print('Rect:', base, height)
...     print('  Area:', calc_rectangle_area(base, height))
...     print('  Perimeter:', calc_rectangle_perimeter(base, height))
...
Rect: 16 39
  Area: 624
  Perimeter: 110
Rect: 92 96
  Area: 8832
  Perimeter: 376
Rect: 60 72
  Area: 4320
  Perimeter: 264
...

Usando la programmazione orientata agli oggetti, possiamo invece creare una classe che rappresenta l’oggetto rettangolo. Invece che rappresentare i rettangoli come una lista di tuple, usiamo la classe per creare 100 istanze della classe Rettangolo, e invece che chiamare le funzioni passando la base e l’altezza, chiamiamo i metodi dell’istanza:


>>> # definiamo una classe che rappresenta un rettangolo generico
>>> class Rectangle:
...     def __init__(self, base, height):
...         """Initialize the base and height attributes."""
...         self.base = base
...         self.height = height
...     def calc_area(self):
...         """Calculate and return the area of the rectangle."""
...         return self.base * self.height
...     def calc_perimeter(self):
...         """Calculate and return the perimeter of a rectangle."""
...         return (self.base + self.height) * 2
...

Nella prossima lezione vedremo piu in dettaglio come definire le classi, ma come possiamo vedere dal prossimo esempio, creare e usare istanze è abbastanza intuitivo:


>>> # creiamo un'istanza della classe Rectangle con base 3 e altezza 5
>>> myrect = Rectangle(3, 5)
>>> myrect.base  # l'istanza ha una base
3
>>> myrect.height  # l'istanza ha un'altezza
5
>>> myrect.calc_area()  # è possibile calcolare l'area direttamente
15
>>> myrect.calc_perimeter()  # e anche il perimetro
16

Ora che abbiamo un’idea di base del funzionamento delle classi, possiamo creare i 100 rettangoli e calcolare area e perimetro:


>>> from random import randrange
>>> # creiamo una lista di 100 istanze di Rectangle con valori casuali
>>> rects = [Rectangle(randrange(100), randrange(100)) for x in range(100)]
>>> # iteriamo la lista di rettangoli e printiamo
>>> # base, altezza, area, perimetro di ogni rettangolo
>>> for rect in rects:
...     print('Rect:', rect.base, rect.height)
...     print('  Area:', rect.calc_area())
...     print('  Perimeter:', rect.calc_perimeter())
...
Rect: 78 44
  Area: 3432
  Perimeter: 244
Rect: 0 85
  Area: 0
  Perimeter: 170
Rect: 32 2
  Area: 64
  Perimeter: 68

Come possiamo vedere confrontando i due esempi, usando la programmazione ad oggetti possiamo lavorare direttamente con oggetti singoli (le istanze di Rectangle). La lista non contiene più tuple, ma rettangoli, e per calcolare area e perimetro non è più necessario passare la base e l’altezza esplicitamente. Inoltre, calc_area() e calc_perimeter() sono associati all’istanza, e quindi non è necessario importare le funzioni, non si rischia di usare la funzione sbagliata (ad esempio una funzione che calcola l’area di un triangolo), non si rischia di passare la base o l’altezza del rettangolo sbagliato o passarli nell’ordine sbagliato.

Termini e concetti

Nei precedendi esempi abbiamo introdotto alcuni termini e concetti nuovi che sono usati comunemente nella programmazione ad oggetti.

Classi

Le classi sono usate per definire le caratteristiche di un oggetto, i suoi attributi (ad esempio la base e l’altezza) e i suoi metodi (ad esempio calc_area() e calc_perimeter()). Le classi sono “astratte” – non si riferiscono a nessun oggetto specifico, ma rappresentano un modello che può essere usato per creare istanze. Ad esempio la classe Rectangle specifica che i rettangoli hanno una base, un’altezza, un’area e un perimetro, ma la classe non si riferisce a nessun rettangolo in particolare.

Istanze

Le istanze sono oggetti creati a partire da una classe. Ad esempio Rectangle(3, 5) ci restituisce un’istanza della classe Rectangle che si riferisce a uno specifico rettangolo che ha base 3 e altezza 5. Una classe può essere usata per creare diverse istanze dello stesso tipo ma con attributi diversi, come i 100 diversi rettangoli che abbiamo visto nell’esempio precedente. È possibile usare i metodi definiti dalla classe con ogni istanza, semplicemente facendo istanza.metodo() (ad esempio myrect.calc_area()).

Attributi

Gli attributi sono dei valori associati all’istanza, come ad esempio la base e l’altezza del rettangolo. Gli attributi di ogni istanza sono separati: ogni istanza di Rectangle ha una base e un’altezza diversa. Per accedere a un attributo basta fare istanza.attributo (ad esempio myrect.base).

Metodi

I metodi descrivono il comportamento dell’oggetto, sono simili alle funzioni, e sono specifici per ogni classe. Ad esempio sia la classe Rectangle che la classe Triangle possono definire un metodo chiamato calc_area(), che ritornerà risultati diversi in base al tipo dell’istanza. I metodi possono accedere altri attributi e metodi dell’istanza: questo ci permette ad esempio di chiamare myrect.calc_area() senza dover passare la base e l’altezza esplicitamente. Per chiamare un metodo basta fare istanza.metodo() (ad esempio myrect.calc_area()).

Ereditarietà

Un altro concetto importante della programmazione è l’ereditarietà. L’ereditarietà ci permette di creare una nuova classe a partire da una classe esistente e di estenderla o modificarla.

Per esempio possiamo creare una classe Square che eredita dalla classe Rectangle. Dato che i 4 lati di un quadrato hanno la stessa lunghezza, non è più necessario richiedere base e altezza separatamente, quindi nella classe Square possiamo modificare l’inizializzazione in modo da richiedere la lunghezza di un singolo lato. Così facendo possiamo definire una nuova classe che invece di accettare e definire i due attributi base e height definisce e accetta un singolo attributo side. Dato che il quadrato è un tipo particolare di rettangolo, i metodi per calcolare area e perimetro funzionano senza modifiche e possiamo quindi utilizzare calc_area() e calc_perimeter() ereditati automaticamente dalla classe Rectangle senza doverli ridefinire.

È inoltre possibile definire gerarchie di classi, ad esempio si può definire la clase Husky che eredita dalla classe Cane che eredita dalla classe Mammifero che eredita dalla classe Animale. Ognuna di queste classi può definire attributi e comportamenti comuni a tutti gli oggetti di quella classe, e le sottoclassi possono aggiungerne di nuovi.

Python supporta anche l’ereditarietà multipla: è possibile definire nuovi classi che ereditano metodi e attributi da diverse altre classi, combinandoli.

Nella prossima lezione vedremo esempi concreti di utilizzo dell’ereditarietà.

Superclassi e sottoclassi

Se la classe Square eredita dalla classe Rectangle, possiamo dire che Rectangle è la superclasse (o classe base – base class in inglese) mentre Square è la sottoclasse (o subclasse). L’operazione di creare una sottoclasse a partire da una classe esistente è a volte chiamata subclassare.

Overloading degli operatori

In Python, le classi ci permettono anche di ridefinire il comportamento degli operatori: questa operazione è chiamata overloading degli operatori. È possibile definire metodi speciali che vengono invocati automaticamente quando un operatore viene usato con un’istanza della classe.

Ad esempio possiamo definire che myrect1 < myrect2 ritorni True quando l’area di myrect1 è inferiore a quella di myrect2, oppure possiamo definire che myrect1 + myrect2 ritorni un nuova istanza di Rectangle creata dalla combinazione di myrect1 e myrect2.

Quando usare la programmazione ad oggetti

Anche se la programmazione ad oggetti è uno strumento molto utile e potente, non è la soluzione a tutti i problemi. Spesso creare una semplice funzione è sufficiente e non è necessario definire una classe.

In genere la programmazione ad oggetti può essere la soluzione adatta se:

  • la classe che vogliamo creare rappresenta un oggetto (es. Rectangle, Person, Student, Window, Widget, Connection, ecc.);
  • vogliamo associare all’oggetto sia dati che comportamenti;
  • vogliamo creare diverse istanze della stessa classe.

La programmazione ad oggetti potrebbe non essere la soluzione migliore se:

  • la classe che vogliamo creare non rappresenta un oggetto, ma ad esempio un verbo (es. Find, Connect, ecc.);
  • vogliamo solo rappresentare dati (meglio usare una struttura dati come list, dict, namedtuple, ecc.) o solo comportamenti (meglio usare funzioni, eventualmente raggruppate in un modulo separato);
  • vogliamo creare una sola istanza della stessa classe (meglio usare un modulo per raggruppare dati e funzioni).

Ovviamente ci sono anche delle eccezioni (ad esempio il pattern singleton, che definisce una classe che prevede una sola istanza). Python è un linguaggio multiparadigma, ed è quindi importante scegliere il paradigma che meglio si adatta alla situazione.

Nella prossima lezione vedremo in dettaglio come definire e usare classi in Python.

Se vuoi aggiornamenti su Programmazione inserisci la tua e-mail nel box qui sotto:

Se vuoi ricevere informazioni personalizzate compila anche i seguenti campi:

25 / 40

Classi in Python

Ultime notizie

ThisPersonDoesNotExist: generatore automatico di volti realistici

Microsoft: disattivare Windows Defender non risolve i problemi di WSL

Python 3.8 su Fedora 31?

Copyright: cosa prevede (veramente) la Direttiva

Red Hat: basta con MongoDB, largo a PostgreSQL

I Video di HTML.it

Resynthesizer: ritaglio “magico” con GIMP

Percorsi formativi correlati
Android Mobile Developer

Android Mobile Developer

5
guide
250 ore

Tutti i linguaggi per diventare uno sviluppatore di app per Android.

DB Administrator

DB Administrator

4
guide
80 ore

Come creare applicazioni per il Web con PHP e MySQL per il DBMS.

iOS Mobile Developer

iOS Mobile Developer

4
guide
180 ore

Tutte le principali tecnologie per diventare uno sviluppatore mobile per iOS.

Java Developer

Java Developer

7
guide
300 ore

I fondamentali per lo sviluppo di applicazioni multi piattaforma con Java.

Java Security Expert

Java Security Expert

5
guide
120 ore

Diventare degli esperti in tema di sicurezza delle applicazioni Java.

Maker

Maker

2
guide
50 ore

Usare Raspberry Pi e Arduino per avvicinarsi al mondo dei Maker e dell’IoT.

NoSQL DB Expert

NoSQL DB Expert

5
guide
200 ore

Le principali guide di HTML.it per diventare un esperto dei database NoSQL.

PHP Cloud Developer

PHP Cloud Developer

7
guide
80 ore

Ecco come i professionisti creano applicazioni per il Cloud con PHP.

PHP Developer

PHP Developer

5
guide
100 ore

Lo sviluppo professionale di applicazioni in PHP alla portata di tutti.

PHP e JavaScript Developer

PHP e JavaScript Developer

6
guide
100 ore

Come sviluppare applicazioni Web dinamiche con PHP e JavaScript.

PHP Framework Expert

PHP Framework Expert

6
guide
120 ore

Realizzare applicazioni per il Web utilizzando i framework PHP.

PHP SysAdmin

PHP SysAdmin

6
guide
80 ore

Creare applicazioni PHP e gestire l’ambiente di sviluppo come un pro.

Sviluppare un eCommerce con PHP

Sviluppare un eCommerce con PHP

5
guide
120 ore

Fare gli eCommerce developer con Magento, Prestashop e WooCommerce.

Web &amp; Mobile Designer

Web & Mobile Designer

5
guide
300 ore

Percorso base per avvicinarsi al web design con un occhio al mobile.

WordPress Developer

WordPress Developer

5
guide
150 ore

Realizzare siti Web e Web application con WordPress a livello professionale.

Ti consigliamo anche

Guida Python

  • 40 Lezioni
  • Moderata

Python è uno dei linguaggi di programmazione più usati al mondo. Grazie alla sua sintassi asciutta e potente, ed al supporto multipiattaforma, è utilizzato per moltissime tipologie di applicazioni, dal networking, al web, fino al machine learning. Questa guida completa e pratica parte dalle basi del linguaggio, per arrivare ad apprenderne anche le funzionalità più complesse.

  • uncompyle6: un Python cross-version decompiler open source
  • JavaScript è il linguaggio più popolare del 2018 (per StackOverflow)

Python: cifrare file con password in modo sicuro

Utilizzare il modulo cryptography, ed alcuni opportuni accorgimenti, per cifrare (e decifrare) con password e in modo sicuro un file di testo.

  • Cybersecurity e la piaga delle password riciclate
  • Cybersecurity: access token più rischiosi delle password?

Python 3.8 su Fedora 31?

Python e JavaScript, meglio se insieme

Python: non solo Web development

  • Guide
  • Approfondimenti
  • Script
  • Q&A
  • Software
  • Tutorial
  • Videogiochi
  • Tag Software
  • News
  • Video
  • Forum
  • Chi siamo
  • Pubblicità
  • Contatti
  • Cookie policy
  • Privacy policy
  • Privacy Policy Newsletter
© HTML.it 1997-2019 | Triboo Media – P. IVA 06933670967 | HTML.it è un periodico telematico reg. Trib. Roma n. 309/2008 | 2.9.5