{"id":46393,"date":"2021-07-17T09:40:56","date_gmt":"2021-07-17T07:40:56","guid":{"rendered":"https:\/\/kinsta.com\/?p=97958"},"modified":"2023-06-07T11:13:21","modified_gmt":"2023-06-07T10:13:21","slug":"programmazione-orientata-agli-oggetti-python","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/","title":{"rendered":"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)"},"content":{"rendered":"<p>La programmazione \u00e8 un&#8217;arte. E come nell&#8217;arte, selezionare i pennelli e i colori adeguati \u00e8 essenziale per produrre le opere migliori. La programmazione orientata agli oggetti Python rientra in questa categoria.<\/p>\n<p>Scegliere <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/\">il giusto linguaggio di programmazione<\/a> \u00e8 una parte cruciale di qualsiasi progetto, e pu\u00f2 portare sia a uno sviluppo fluido e piacevole che a un completo incubo. \u00c8 per questo che sarebbe meglio usare il linguaggio pi\u00f9 adatto al vostro caso d&#8217;uso.<\/p>\n<p>Questa \u00e8 la ragione principale per imparare la programmazione orientata agli oggetti in Python, che \u00e8 anche uno dei linguaggi di programmazione pi\u00f9 popolari.<\/p>\n<p>Iniziamo!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Un Esempio di Programma Python<\/h2>\n<p>Prima di addentrarci nell&#8217;argomento, iniziamo con una domanda: avete mai scritto un programma Python come quello qui sotto?<\/p>\n<pre><code class=\"language-python\">secret_number = 20\n \nwhile True:\n   number = input('Guess the number: ')\n \n   try:\n       number = int(number)\n   except:\n       print('Sorry that is not a number')\n       continue\n \n   if number != secret_number:\n       if number &gt; secret_number:\n           print(number, 'is greater than the secret number')\n \n       elif number &lt; secret_number:\n           print(number, 'is less than the secret number')\n   else:\n       print('You guessed the number:', secret_number)\n       break\n<\/code><\/pre>\n<p>Questo codice \u00e8 un semplice strumento per indovinare i numeri. Provate a copiarlo in un file Python e a eseguirlo nel vostro sistema. Compie perfettamente il suo scopo.<\/p>\n<p>Ma qui arriva un enorme problema: cosa succederebbe se vi chiedessimo di implementare una <a href=\"https:\/\/kinsta.com\/it\/changelog\/\">nuova funzionalit\u00e0<\/a>? Potrebbe essere qualcosa di semplice, per esempio:<\/p>\n<p>&#8220;Se l&#8217;input \u00e8 un multiplo del numero segreto, dai un suggerimento all&#8217;utente&#8221;.<\/p>\n<p>Il programma diventerebbe presto complesso e pesante all\u2019aumentare del numero di funzioni e, quindi, del numero totale di condizionali annidate.<\/p>\n<p>Questo \u00e8 esattamente il problema che la programmazione orientata agli oggetti cerca di risolvere.<\/p>\n\n<h2>Requisiti per Imparare Python OOP<\/h2>\n<p>Prima di addentrarsi nella programmazione orientata agli oggetti (OOP, object-oriented programming), vi consigliamo vivamente di avere una solida conoscenza delle basi di Python.<\/p>\n<p>Classificare gli argomenti considerati &#8220;di base&#8221; pu\u00f2 essere difficile. Per questo abbiamo progettato un <a href=\"https:\/\/kinsta.com\/it\/cheat-sheets\/\">cheat sheet<\/a> con tutti i principali concetti necessari per imparare la programmazione orientata agli oggetti in Python.<b><\/b><\/p>\n<ul>\n<li><b>Variabile: <\/b>Nome simbolico che punta a un oggetto specifico (vedremo cosa significa il termine <b>oggetto<\/b> nel corso dell&#8217;articolo).<\/li>\n<\/ul>\n<ul>\n<li><b>Gli operatori aritmetici: <\/b>Addizione (+), sottrazione (-), moltiplicazione (*), divisione (\/), divisione intera (\/\/), modulo (%).<\/li>\n<\/ul>\n<ul>\n<li><b>Tipi di dati incorporati: <\/b>Numerici (interi, float, complessi), sequenze (stringhe, liste, tuple), booleani (vero, falso), dizionari e insiemi.<\/li>\n<\/ul>\n<ul>\n<li><b>Espressioni booleane: <\/b>Espressioni in cui il risultato \u00e8 <b>Vero<\/b> o <b>Falso.<\/b><\/li>\n<\/ul>\n<ul>\n<li><b>Condizionale: <\/b>Valuta un&#8217;espressione booleana e genera qualche processo a seconda del risultato. Gestito da dichiarazioni <b>if\/else<\/b>.<\/li>\n<\/ul>\n<ul>\n<li><b>Loop: <\/b>Esecuzione ripetuta di blocchi di codice. Possono essere loop <b>for <\/b> o <b>while <\/b>.<\/li>\n<\/ul>\n<ul>\n<li><b>Funzioni: <\/b>Blocco di codice organizzato e riutilizzabile. Si creano con la parola chiave <b>def<\/b>.<\/li>\n<\/ul>\n<ul>\n<li><b>Argomenti: <\/b>Oggetti passati a una funzione. Per esempio: <code>sum([1, 2, 4])<\/code><\/li>\n<\/ul>\n<ul>\n<li><b>Eseguire uno script Python<\/b>: Aprire un terminale o <a href=\"https:\/\/kinsta.com\/it\/blog\/commandi-ssh\/\">riga di comando<\/a> e digitare &#8220;python .<\/li>\n<\/ul>\n<ul>\n<li><b>Aprire una shell Python<\/b>: Aprire un terminale e digitare <code>python<\/code> o <code>python3<\/code> a seconda del vostro sistema.<\/li>\n<\/ul>\n<p>Ora che avete questi concetti cristallini, potete andare avanti con la comprensione della programmazione orientata agli oggetti.<\/p>\n<h2>Cos&#8217;\u00c8 la Programmazione Orientata agli Oggetti in Python?<\/h2>\n<p>La Programmazione Orientata agli Oggetti (OOP) \u00e8 un paradigma di programmazione in cui possiamo pensare a problemi complessi come oggetti.<\/p>\n<p>Un paradigma \u00e8 una teoria che fornisce la base per risolvere i problemi.<\/p>\n<p>Quindi quando parliamo di OOP, ci riferiamo a un insieme di concetti e modelli che usiamo per risolvere problemi con oggetti.<\/p>\n<p>Un oggetto in Python \u00e8 una singola collezione di dati (attributi) e comportamenti (metodi). Potete pensare agli oggetti come a cose reali che vi circondano. Per esempio, considerate le calcolatrici:<\/p>\n<figure style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Objects-around-you.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Objects-around-you.png\" alt=\"Una calcolatrice pu\u00f2 essere un oggetto.\" width=\"1024\" height=\"512\"><\/a><figcaption class=\"wp-caption-text\">Una calcolatrice pu\u00f2 essere un oggetto.<\/figcaption><\/figure>\n<p>Come potete notare, i dati (attributi) sono sempre sostantivi, mentre i comportamenti (metodo) sono sempre verbi.<\/p>\n<p>Questa compartimentazione \u00e8 il concetto centrale della programmazione orientata agli oggetti. Si costruiscono oggetti che immagazzinano dati e contengono specifici tipi di funzionalit\u00e0.<\/p>\n<h2>Perch\u00e9 Usiamo la Programmazione Orientata agli Oggetti in Python?<\/h2>\n<p>OOP permette di creare software sicuro e affidabile. Molti <a href=\"https:\/\/kinsta.com\/it\/blog\/php-vs-python\/#library-support\">framework e librerie Python<\/a> usano questo paradigma per costruire il loro codice base. Alcuni esempi sono Django, Kivy, pandas, NumPy e TensorFlow.<\/p>\n<p>Vediamo i principali vantaggi dell&#8217;uso di OOP in Python.<\/p>\n<h3>Vantaggi di Python OOP<\/h3>\n<p>Le seguenti ragioni vi faranno optare per l&#8217;uso della programmazione orientata agli oggetti in Python.<\/p>\n<h4>Tutti i Linguaggi di Programmazione Moderni Usano OOP<\/h4>\n<p>Questo paradigma \u00e8 indipendente dalla lingua. Se imparate l&#8217;OOP in Python, sarete in grado di usarlo anche in:<\/p>\n<ul>\n<li>Java<\/li>\n<li>PHP (assicuratevi di leggere il <a href=\"https:\/\/kinsta.com\/it\/blog\/php-vs-python\/\">confronto tra PHP e Python<\/a>)<\/li>\n<li>Ruby<\/li>\n<li><a href=\"https:\/\/kinsta.com\/it\/blog\/librerie-javascript\/\">Javascript<\/a><\/li>\n<li>C#<\/li>\n<li>Kotlin<\/li>\n<\/ul>\n<p>Tutti questi linguaggi sono nativamente orientati agli oggetti o includono opzioni per funzionalit\u00e0 orientate agli oggetti. Se volete imparare uno di questi dopo aver appreso Python, sar\u00e0 pi\u00f9 facile perch\u00e9 troverete molte somiglianze tra i linguaggi che lavorano con gli oggetti.<\/p>\n<h4>OOP Vi Permette di Codificare Pi\u00f9 Velocemente<\/h4>\n<p>Codificare pi\u00f9 velocemente non significa scrivere meno righe di codice. Significa che potete implementare pi\u00f9 funzioni in meno tempo senza compromettere la stabilit\u00e0 di un progetto.<\/p>\n<p>La programmazione orientata agli oggetti permette di riutilizzare il codice implementando l\u2019<a href=\"#1-abstraction\" target=\"_blank\" rel=\"noopener noreferrer\">astrazione<\/a>. Questo principio rende il vostro codice pi\u00f9 conciso e leggibile.<\/p>\n<p>Come forse sapete, <a href=\"https:\/\/kinsta.com\/it\/blog\/assumere-uno-sviluppatore-wordpress\/\">i programmatori<\/a> passano molto pi\u00f9 tempo a leggere il codice che a scriverlo. \u00c8 la ragione per cui la leggibilit\u00e0 \u00e8 sempre pi\u00f9 importante che pubblicare le caratteristiche il pi\u00f9 velocemente possibile.<\/p>\n<figure style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Not-legible-code.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Not-legible-code.png\" alt=\"La produttivit\u00e0 diminuisce con codice non leggibile\" width=\"1024\" height=\"512\"><\/a><figcaption class=\"wp-caption-text\">La produttivit\u00e0 diminuisce con codice non leggibile<\/figcaption><\/figure>\n<p>Vedrete pi\u00f9 avanti il principio di astrazione.<\/p>\n<h4>OOP Vi Aiuta e Evitare il \u201cCodice Spaghetti\u201d<\/h4>\n<p>Vi ricordate il programma indovina numeri scritto all&#8217;inizio di questo articolo?<\/p>\n<p>Se continuate ad aggiungere funzioni, in futuro avrete molte dichiarazioni <b>if<\/b> annidate. Questo groviglio di linee di codice infinite \u00e8 chiamato codice spaghetti, e si dovrebbe evitare il pi\u00f9 possibile.<\/p>\n<p>OOP ci d\u00e0 la possibilit\u00e0 di <a href=\"https:\/\/kinsta.com\/it\/blog\/attivare-compressione-gzip\/\">comprimere<\/a> tutta la logica in oggetti, evitando cos\u00ec lunghi pezzi di <b>if<\/b> annidati.<\/p>\n<h4>OOP Migliora l&#8217;Analisi di Qualsiasi Situazione<\/h4>\n<p>Una volta acquisita un po&#8217; di esperienza con l&#8217;OOP, sarete in grado di pensare ai problemi come a piccoli e specifici oggetti.<\/p>\n<p>Questa comprensione porta a una rapida inizializzazione del progetto.<\/p>\n<h3>Programmazione Strutturata vs. Programmazione Orientata agli Oggetti<\/h3>\n<p>La programmazione strutturata \u00e8 il paradigma pi\u00f9 usato dai principianti perch\u00e9 \u00e8 il modo pi\u00f9 semplice per costruire un piccolo programma.<\/p>\n<p>Implica l&#8217;esecuzione di un programma Python in modo sequenziale. Questo significa che state dando al computer una lista di compiti e poi li eseguite dall&#8217;alto verso il basso.<\/p>\n<p>Vediamo un esempio di programmazione strutturata con un programma dedicato a chi vuole comprare caff\u00e8:<\/p>\n<pre><code class=\"language-python\">small = 2\nregular = 5\nbig = 6\n \nuser_budget = input('What is your budget? ')\n \ntry:\n   user_budget = int(user_budget)\nexcept:\n   print('Please enter a number')\n   exit()\n \nif user_budget &gt; 0:\n   if user_budget &gt;= big:\n       print('You can afford the big coffee')\n       if user_budget == big:\n           print('It\\'s complete')\n       else:\n           print('Your change is', user_budget - big)\n   elif user_budget == regular:\n       print('You can afford the regular coffee')\n       print('It\\'s complete')\n   elif user_budget &gt;= small:\n       print('You can buy the small coffee')\n       if user_budget == small:\n           print('It\\'s complete')\n       else:\n           print('Your change is', user_budget - small)\n<\/code><\/pre>\n<p>Il codice qui sopra agisce come una persona che vende caff\u00e8. Vi chieder\u00e0 un budget, poi vi &#8220;vender\u00e0&#8221; il caff\u00e8 pi\u00f9 grande che siete in grado di comprare.<\/p>\n<p>Provate a eseguirlo nel <a href=\"https:\/\/kinsta.com\/it\/blog\/wp-cli\/\">terminale<\/a>. Verr\u00e0 eseguito passo dopo passo, a seconda del vostro input.<\/p>\n<p>Questo codice funziona perfettamente, ma abbiamo tre problemi:<\/p>\n<ol>\n<li>Include un sacco di logica ripetuta.<\/li>\n<li>Usa molti condizionali <b>if<\/b> annidati.<\/li>\n<li>Sar\u00e0 difficile da leggere e modificare.<\/li>\n<\/ol>\n<p>La OOP \u00e8 stata inventata come soluzione a tutti questi problemi.<\/p>\n<p>Vediamo il programma di cui sopra implementato con OOP. Non preoccupatevi se non lo capite ancora. \u00c8 solo per confrontare la programmazione strutturata e la programmazione orientata agli oggetti.<\/p>\n<pre><code class=\"language-python\">class Coffee:\n        # Constructor\n        def __init__(self, name, price):\n                self.name = name\n                self.price = float(price)\n        def check_budget(self, budget):\n                # Check if the budget is valid\n                if not isinstance(budget, (int, float)):\n                        print('Enter float or int')\n                        exit()\n                if budget = self.price:\n                        print(f'You can buy the {self.name} coffee')\n                        if budget == self.price:\n                                print('It\\'s complete')\n                        else:\n                                print(f'Here is your change {self.get_change(budget)}$')\n\n                        exit('Thanks for your transaction')\n<\/code><\/pre>\n<p><b>Nota: <\/b>tutti i concetti che seguono saranno spiegati pi\u00f9 a fondo nell&#8217;articolo.<\/p>\n<p>Il codice qui sopra rappresenta una <b>classe<\/b> chiamata &#8220;Caff\u00e8&#8221;. Ha due attributi &#8211; &#8220;name&#8221; e &#8220;price&#8221; &#8211; ed entrambi sono usati nei metodi. Il metodo principale \u00e8 &#8220;sell&#8221;, che elabora tutta la logica necessaria per completare il processo di vendita.<\/p>\n<p>Se provate a eseguire questa classe, non otterrete alcun output. Ci\u00f2 accade principalmente perch\u00e9 stiamo solo dichiarando il &#8220;modello&#8221; per i caff\u00e8, non i caff\u00e8 stessi.<\/p>\n<p>Implementiamo questa classe con il seguente codice:<\/p>\n<pre><code class=\"language-python\">small = Coffee('Small', 2)\nregular = Coffee('Regular', 5)\nbig = Coffee('Big', 6)\n \ntry:\n   user_budget = float(input('What is your budget? '))\nexcept ValueError:\n   exit('Please enter a number')\n \nfor coffee in [big, regular, small]:\n   coffee.sell(user_budget)\n<\/code><\/pre>\n<p>Qui stiamo creando <b>istanze<\/b> o oggetti caff\u00e8, della classe &#8220;Coffee&#8221;, poi chiamiamo il metodo &#8220;sell&#8221; di ogni caff\u00e8 finch\u00e9 l&#8217;utente non pu\u00f2 permettersi qualsiasi opzione.<\/p>\n<p>Otterremo lo stesso risultato con entrambi gli approcci, ma possiamo estendere la funzionalit\u00e0 del programma molto meglio con OOP.<\/p>\n<p>Qui sotto c&#8217;\u00e8 una tabella che confronta la programmazione orientata agli oggetti e la programmazione strutturata:<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>OOP<\/strong><\/td>\n<td><strong>Programmazione strutturata<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Pi\u00f9 facile da mantenere<\/td>\n<td>Pi\u00f9 complessa da mantenere<\/td>\n<\/tr>\n<tr>\n<td>Approccio DRY (Don&#8217;t Repeat Yourself)<\/td>\n<td>Codice ripetuto in molti posti<\/td>\n<\/tr>\n<tr>\n<td>Piccoli pezzi di codice riutilizzati in molti posti<\/td>\n<td>Una grande quantit\u00e0 di codice in pochi posti<\/td>\n<\/tr>\n<tr>\n<td>Approccio a oggetti<\/td>\n<td>Approccio a blocchi di codice<\/td>\n<\/tr>\n<tr>\n<td>Pi\u00f9 facile fare il <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-debug\/\">debug<\/a><\/td>\n<td>Pi\u00f9 difficile da debuggare<\/td>\n<\/tr>\n<tr>\n<td>Ripida curva di apprendimento<\/td>\n<td>Curva di apprendimento pi\u00f9 semplice<\/td>\n<\/tr>\n<tr>\n<td>Usato in <a href=\"https:\/\/kinsta.com\/it\/clienti\/\">grandi progetti<\/a><\/td>\n<td>Ottimizzato per programmi semplici<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Per concludere il confronto dei paradigmi:<\/p>\n<ul>\n<li>Nessuno dei due paradigmi \u00e8 perfetto (OOP pu\u00f2 essere pesante da usare in progetti semplici).<\/li>\n<li>Questi sono solo due modi di risolvere un problema; ce ne sono altri l\u00e0 fuori.<\/li>\n<li>OOP \u00e8 usato in grandi codebase, mentre la programmazione strutturata \u00e8 principalmente per progetti semplici.<\/li>\n<\/ul>\n<p>Passiamo agli oggetti incorporati in Python.<\/p>\n<h2>In Python Tutto \u00c8 un Oggetto<\/h2>\n<p>Vi diremo un segreto: avete usato OOP tutto il tempo senza accorgervene.<\/p>\n<p>Anche quando usate altri paradigmi in Python, state ancora usando gli oggetti per fare quasi tutto.<\/p>\n<p>Questo perch\u00e9, in Python, <i>tutto<\/i> \u00e8 un oggetto.<\/p>\n<p>Ricordate la definizione di oggetto: un oggetto in Python \u00e8 una singola collezione di dati (attributi) e comportamenti (metodi).<\/p>\n<p>Questo corrisponde a qualsiasi tipo di dati in Python.<\/p>\n<p>Una stringa \u00e8 una collezione di dati (caratteri) e comportamenti (<strong>upper()<\/strong>, <strong>lower()<\/strong>, ecc.). Lo stesso vale per i numeri <b>integrali<\/b>, <b>float<\/b>, <b>boolean<\/b>, le <b>liste<\/b> e per i dizionari.<\/p>\n<p>Prima di continuare, rivediamo il significato degli attributi e dei metodi.<\/p>\n<h3>Attributi e Metodi<\/h3>\n<p>Gli attributi sono <b>variabili interne<\/b> agli oggetti, mentre i metodi sono <b>funzioni<\/b> che producono un certo comportamento.<\/p>\n<p>Facciamo un semplice esercizio nella shell di Python. Potete aprirla digitando <code>python<\/code> o <code>python3<\/code> nel vostro terminale.<\/p>\n<figure style=\"width: 843px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Python-terminal.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Python-terminal.png\" alt=\"Python shell\" width=\"843\" height=\"123\"><\/a><figcaption class=\"wp-caption-text\">Python shell<\/figcaption><\/figure>\n<p>Ora lavoriamo con la <a href=\"https:\/\/kinsta.com\/it\/blog\/ssh-ssl\/\">shell<\/a> Python per scoprire metodi e tipi.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; kinsta = 'Kinsta, Premium Application, Database, and Managed WordPress hosting'\n&gt;&gt;&gt; kinsta.upper()\n'KINSTA, PREMIUM APPLICATION, DATABASE, AND MANAGED WORDPRESS HOSTING'\n<\/code><\/pre>\n<p>Nella seconda riga, stiamo chiamando un metodo di stringa, <b>upper()<\/b>. Restituisce il contenuto della stringa tutto in maiuscolo senza cambiare la variabile originale.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; kinsta\n'Kinsta, Premium Application, Database, and Managed WordPress hosting'\n<\/code><\/pre>\n<p>Approfondiamo le funzioni pi\u00f9 preziose quando si lavora con gli oggetti.<\/p>\n<p>La funzione <b>type()<\/b> permette di ottenere il tipo di un oggetto. Il &#8220;tipo&#8221; \u00e8 la classe a cui appartiene l&#8217;oggetto.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; type(kinsta)\n# class 'str'\n<\/code><\/pre>\n<p>La funzione <b>dir()<\/b> restituisce tutti gli attributi e i metodi di un oggetto. Proviamola con la variabile <b>kinsta<\/b>.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; dir(ki<span id=\"urn:enhancement-8\" class=\"textannotation\">nsta)\n<\/span>['__add__', '__class__',  ........... 'upper', 'zfill']\n<\/code><\/pre>\n<p>Ora provate a pubblicare alcuni degli attributi nascosti di questo oggetto.<\/p>\n<pre><code class=\"language-python\"> &gt;&gt;&gt; kinsta.__class__ # class 'str' e&gt;<\/code><\/pre>\n<p>Questo mostrer\u00e0 la classe a cui appartiene l&#8217;oggetto <b>kinsta<\/b>. Quindi possiamo dire che l&#8217;unica cosa che la funzione <b>type<\/b> restituisce \u00e8 l&#8217;attributo <b>__class__<\/b> di un oggetto.<\/p>\n<p>Potete sperimentare tutti i tipi di dati, scoprendo tutti i loro attributi e metodi direttamente sul terminale. Potete imparare di pi\u00f9 sui tipi di dati incorporati nella <a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html\" target=\"_blank\" rel=\"noopener noreferrer\">documentazione ufficiale<\/a>.<\/p>\n<h2>Il Vostro Primo Oggetto in Python<\/h2>\n<p>Una <b>classe<\/b> \u00e8 come un template. Vi permette di creare oggetti personalizzati basati sugli attributi e i metodi che definite.<\/p>\n<p>Potete pensarla come uno <b>stampino per biscotti<\/b> che modificate per cuocere i biscotti perfetti (oggetti, non <a href=\"https:\/\/kinsta.com\/it\/blog\/cookie-wordpress-e-sessioni-php\/\">cookie di tracciamento<\/a>), con caratteristiche definite: forma, dimensione e altro.<\/p>\n<p>Dall&#8217;altra parte, abbiamo le <b>istanze<\/b>. Un&#8217;istanza \u00e8 un oggetto individuale di una classe, che ha un indirizzo di memoria unico.<\/p>\n<figure style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Instances.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Instances.png\" alt=\"Un cookie di classe con pi\u00f9 istanze, cookie1, cookie2, e cookie3\" width=\"1024\" height=\"512\"><\/a><figcaption class=\"wp-caption-text\">Istanze in Python<\/figcaption><\/figure>\n<p>Ora che sapete cosa sono le classi e le istanze, definiamone alcune!<\/p>\n<p>Per definire una classe in Python, si usa la parola chiave <b>class<\/b>, seguita dal suo nome. In questo caso, creerete una classe chiamata <b>Cookie<\/b>.<\/p>\n<p><b>Nota: <\/b> in Python, usiamo la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Camel_case#:~:text=Camel%20case%20(sometimes%20stylized%20as,word%20starting%20with%20e20either%20case.\" target=\"_blank\" rel=\"noopener noreferrer\">convenzione Camel Case per i nomi delle classi<\/a>.<\/p>\n<pre><code class=\"language-python\">class Cookie:\n    pass\n<\/code><\/pre>\n<p>Aprite la vostra shell Python e digitate il codice qui sopra. Per creare un&#8217;istanza di una classe, basta digitare il suo nome e la parentesi dopo di esso. \u00c8 lo stesso processo che invocare una funzione.<\/p>\n<pre><code class=\"language-python\">cookie1 = Cookie()\n<\/code><\/pre>\n<p>Congratulazioni: avete appena creato il vostro primo oggetto in Python! Potete controllare il suo id e il suo tipo con il seguente codice:<\/p>\n<pre><code class=\"language-python\">id(cookie1)\n140130610977040 # Unique identifier of the object\n\ntype(cookie1)\n\n<\/code><\/pre>\n<p>Come potete vedere, questo cookie ha un identificatore unico in memoria, e il suo tipo \u00e8 <b>Cookie<\/b>.<\/p>\n<p>Potete anche controllare se un oggetto \u00e8 un&#8217;istanza di una classe con la funzione <b>isinstance()<\/b>.<\/p>\n<pre><code class=\"language-python\">isinstance(cookie1, Cookie)\n# True\nisinstance(cookie1, int)\n# False\nisinstance('a string', Cookie)\n# False\n<\/code><\/pre>\n<h3>Metodo Costruttore<\/h3>\n<p>Il metodo <b>__init__()<\/b> \u00e8 anche chiamato &#8220;costruttore&#8221;: viene richiamato Python ogni volta che istanziamo un oggetto.<\/p>\n<p>Il <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/#constructor-property-promotion\">costruttore<\/a> crea lo stato iniziale dell&#8217;oggetto con l&#8217;insieme minimo di parametri di cui ha bisogno per esistere. Modifichiamo la classe <b>Cookie<\/b>, in modo che accetti parametri nel suo costruttore.<\/p>\n<pre><code class=\"language-python\">class Cookie:\n    # Constructor\n    def __init__(self, name, shape, chips='Chocolate'):\n        # Instance attributes\n        self.name = name\n        self.shape = shape\n        self.chips = chips\n<\/code><\/pre>\n<p>Nella classe <b>Cookie<\/b>, ogni biscotto deve avere un nome, una forma e dei chip. Abbiamo definito l&#8217;ultimo come &#8220;Chocolate&#8221;.<\/p>\n<p>D&#8217;altra parte, <b>self<\/b> si riferisce all&#8217;istanza della classe (l&#8217;oggetto stesso).<\/p>\n<p>Provate a incollare la classe nella shell e create un&#8217;istanza del cookie come al solito.<\/p>\n<pre><code class=\"language-python\">cookie2 = Cookie()\n# TypeError\n<\/code><\/pre>\n<p>Otterrete un errore. Questo perch\u00e9 dovete fornire l&#8217;insieme minimo di dati di cui l&#8217;oggetto ha bisogno per vivere; in questo caso, <b>name<\/b> e <b>shape<\/b> dato che abbiamo gi\u00e0 impostato <b>chips<\/b> su &#8220;Chocolate&#8221;.<\/p>\n<pre><code class=\"language-python\">cookie2 = Cookie('Awesome cookie', 'Star')\n<\/code><\/pre>\n<p>Per accedere agli attributi di un&#8217;istanza, dovete usare la notazione per punti.<\/p>\n<pre><code class=\"language-python\">cookie2.name\n# 'Cookie impressionante'\ncookie2.shape\n# 'Stella'.\ncookie2.chips\n# 'Cioccolato'\n<\/code><\/pre>\n<p>Per ora, la classe <b>Cookie<\/b> non include niente di troppo succoso. Aggiungiamo un metodo di esempio <b>bake() <\/b> per rendere le cose pi\u00f9 interessanti.<\/p>\n<pre><code class=\"language-python\">classe Cookie:\n    # Costruttore\n    def __init__(self, name, shape, chips='Chocolate'):\n        # Attributi dell'istanza\n        self.name = nome\n        self.shape = forma\n        self.chips = chips\n\n    # L'oggetto passa se stesso come parametro\n    def bake(self):\n        print(f'Questo {self.nome}, viene cotto con la forma {self.forma} e i chip di {self.chips}')\n        print('Goditi il tuo biscotto!')\n<\/code><\/pre>\n<p>Per richiamare un metodo, usate la notazione per punti e richiamatelo come una funzione.<\/p>\n<pre><code class=\"language-python\">cookie3 = Cookie('Baked cookie', 'Tree')\ncookie3.bake()\n# This Baked cookie, is being baked with the shape Tree and chips of Chocolate\nEnjoy your cookie!\n<\/code><\/pre>\n<h2>I 4 Pilastri della OOP in Python<\/h2>\n<p>La programmazione orientata agli oggetti comprende quattro pilastri principali:<\/p>\n<h4>1. Astrazione<\/h4>\n<p>L&#8217;astrazione nasconde la funzionalit\u00e0 interna di un&#8217;applicazione all&#8217;utente. L&#8217;utente potrebbe essere il cliente finale o altri sviluppatori.<\/p>\n<p>Possiamo trovare l&#8217;<b>astrazione<\/b> nella nostra vita quotidiana. Per esempio, sapete come usare il vostro telefono, ma probabilmente non sapete esattamente cosa succede al suo interno ogni volta che aprite un&#8217;applicazione.<\/p>\n<p>Un altro esempio \u00e8 Python stesso. Sapete come usarlo per costruire <a href=\"https:\/\/kinsta.com\/it\/blog\/software-cms\/\">software funzionale<\/a>, e potete farlo anche se non capite il funzionamento interno di Python.<\/p>\n<p>Applicare lo stesso concetto al codice vi permette di raccogliere tutti gli oggetti in un problema e <b>astrarre<\/b> le funzionalit\u00e0 standard in classi.<\/p>\n<h4>2. Ereditariet\u00e0<\/h4>\n<p>L&#8217;ereditariet\u00e0 ci permette di definire pi\u00f9 <b>sottoclassi<\/b> da una classe gi\u00e0 definita.<\/p>\n<p>Il suo scopo principale \u00e8 quello di seguire il <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\" target=\"_blank\" rel=\"noopener noreferrer\">principio di DRY<\/a>. Sarete in grado di riutilizzare un sacco di codice implementando tutti i componenti di condivisione in <b>superclassi<\/b>.<\/p>\n<p>Potete pensarlo come il concetto concreto di <b>eredit\u00e0 genetica<\/b>. <a href=\"https:\/\/kinsta.com\/it\/blog\/child-theme-wordpress\/\">I figli<\/a> (sottoclassi) sono il risultato dell&#8217;eredit\u00e0 tra due genitori (superclassi). Essi ereditano tutte le caratteristiche fisiche (attributi) e alcuni comportamenti comuni (metodi).<\/p>\n<h4>3. Polimorfismo<\/h4>\n<p>Il polimorfismo ci permette di modificare leggermente i metodi e gli attributi delle <b>sottoclassi<\/b> precedentemente definite nella <b>superclasse<\/b>.<\/p>\n<p>Il significato letterale di polimorfismo \u00e8 &#8220;<b>molteplici forme<\/b>&#8220;. Questo perch\u00e9 costruiamo metodi con lo stesso nome ma con funzionalit\u00e0 diverse.<\/p>\n<p>Tornando all&#8217;idea precedente, anche i bambini sono un perfetto esempio di polimorfismo. Possono ereditare un comportamento definito <b>get_hungry()<\/b> ma in un modo leggermente diverso, per esempio, avere fame ogni 4 ore invece che ogni 6.<\/p>\n<h4>4. Incapsulamento<\/h4>\n<p>L&#8217;incapsulamento \u00e8 il processo con cui proteggiamo l&#8217;integrit\u00e0 interna dei dati in una classe.<\/p>\n<p>Anche se non c&#8217;\u00e8 una dichiarazione <b>private<\/b> in Python, potete applicare l&#8217;incapsulamento usando il <a href=\"https:\/\/en.wikipedia.org\/wiki\/Name_mangling#Python\" target=\"_blank\" rel=\"noopener noreferrer\">name mangling in Python<\/a>. Ci sono metodi speciali chiamati <b>getters<\/b> e <b>setters<\/b> che ci permettono di accedere ad attributi e metodi unici.<\/p>\n<p>Immaginiamo una classe <b>Human<\/b> che ha un attributo unico chiamato <b>_height<\/b>. \u00c8 possibile modificare questo attributo solo entro certi vincoli (\u00e8 quasi impossibile per una persona superare l\u2019altezza di 3 metri).<\/p>\n<h2>Costruire un Calcolatore di Area per Forme Diverse<\/h2>\n<p>Una delle cose migliori di Python \u00e8 che ci permette di creare una grande variet\u00e0 di software, da un programma <a href=\"https:\/\/kinsta.com\/it\/docs\/devkinsta\/wp-cli\/\">CLI (interfaccia a riga di comando)<\/a> a una complessa web app.<\/p>\n<p>Ora che avete imparato i concetti pilastro dell&#8217;OOP, \u00e8 il momento di applicarli a un progetto reale.<\/p>\n<p><b>Nota: <\/b>tutto il seguente codice sar\u00e0 disponibile all&#8217;interno di questo <a href=\"https:\/\/github.com\/DaniDiazTech\/Object-Oriented-Programming-in-Python\/blob\/main\/shape_calculator\/calculator.py\" target=\"_blank\" rel=\"noopener noreferrer\">repository di GitHub<\/a>. Uno <a href=\"https:\/\/kinsta.com\/it\/blog\/strumenti-di-revisione-del-codice\/#3-github\">strumento di revisione del codice<\/a> che ci aiuta a gestire le versioni del codice con Git.<\/p>\n<p>Il vostro compito \u00e8 quello di creare un calcolatore di aree per le seguenti forme:<\/p>\n<ul>\n<li>Quadrato<\/li>\n<li>Rettangolo<\/li>\n<li>Triangolo<\/li>\n<li>Cerchio<\/li>\n<li>Esagono<\/li>\n<\/ul>\n<h3>Classe di Base per le Forme<\/h3>\n<p>Per prima cosa, create un file <b>calculator.py<\/b> e apritelo. Dato che abbiamo gi\u00e0 gli oggetti con cui lavorare, sar\u00e0 facile <b>astrarli<\/b> in una classe.<\/p>\n<p>Potete analizzare le caratteristiche comuni e scoprire che sono tutte <b>forme 2D<\/b>. Pertanto, l&#8217;opzione migliore \u00e8 creare una classe <b>Shape<\/b> con un metodo <b>get_area()<\/b> da cui ogni forma erediter\u00e0.<\/p>\n<p><b>Nota: <\/b>tutti i metodi dovrebbero essere verbi. Questo perch\u00e9 questo metodo si chiama <b>get_area()<\/b> e non <b>area()<\/b>.<\/p>\n<pre><code class=\"language-python\">class Shape:\n    def __init__(self):\n        pass\n\n    def get_area(self):\n        pass\n<\/code><\/pre>\n<p>Il codice sopra definisce la classe; tuttavia, non c&#8217;\u00e8 ancora nulla di interessante in essa.<\/p>\n<p>Implementiamo le funzionalit\u00e0 standard della maggior parte di queste forme.<\/p>\n<pre><code class=\"language-python\">class Shape:\n    def __init__(self, side1, side2):\n        self.side1 = side1\n        self.side2 = side2\n\n    def get_area(self):\n        return self.side1 * self.side2\n\n    def __str__(self):\n        return f'The area of this {self.__class__.__name__} is: {self.get_area()}'\n<\/code><\/pre>\n<p>Analizziamo cosa stiamo facendo con questo codice:<\/p>\n<ul>\n<li>Nel metodo <b>__init__<\/b>, richiediamo due parametri, <b>side1<\/b> e <b>side2<\/b>. Questi rimarranno come <b>attributi dell&#8217;istanza<\/b>.<\/li>\n<li>La funzione <b>get_area()<\/b> restituisce l&#8217;area della forma. In questo caso, sta usando la formula dell&#8217;area di un rettangolo poich\u00e9 sar\u00e0 pi\u00f9 facile da implementare con altre forme.<\/li>\n<li>Il metodo <b>__str__()<\/b> \u00e8 un &#8220;metodo magico&#8221; proprio come <b>__init__().<\/b> Consente di modificare il modo in cui un&#8217;istanza verr\u00e0 pubblicata.<\/li>\n<li>L&#8217;attributo <b>self.__class__.__name__<\/b> nascosto si riferisce al nome della classe. Se state lavorando con una classe <b>Triangle<\/b>, questo attributo sar\u00e0 &#8220;Triangle.&#8221;<\/li>\n<\/ul>\n<h3>Classe Rectangle<\/h3>\n<p>Dal momento che abbiamo implementato la formula dell&#8217;area del rettangolo, potremmo creare una semplice classe per il rettangolo (che nel nostro esempio abbiamo lasciato in inglese, <b>Rectangle<\/b>) che non fa altro che ereditare dalla classe <b>Forma<\/b>.<\/p>\n<p>Per applicare l&#8217;<b>ereditariet\u00e0<\/b> in Python, si crea una classe come al solito e si circonda la <b>superclasse<\/b> da cui si vuole ereditare con delle parentesi.<\/p>\n<pre><code class=\"language-python\"># Folded base class\nclass Shape: ...\n \nclass Rectangle(Shape): # Superclass in Parenthesis\n    pass\n<\/code><\/pre>\n<h3>Classe Square<\/h3>\n<p>Possiamo avere un eccellente approccio al <b>polimorfismo<\/b> con la classe per il quadrato, che nel nostro esempio abbiamo lasciato in inglese: <b>Square<\/b>.<\/p>\n<p>Ricordate che un quadrato \u00e8 solo un rettangolo i cui quattro lati sono tutti uguali. Questo significa che possiamo usare la stessa formula per ottenere l&#8217;area.<\/p>\n<p>Possiamo farlo modificando il metodo <strong>init<\/strong>, accettando solo un lato come parametro, quindi <b>side<\/b> in inglese, e passando il valore di quel lato al costruttore della classe <b>Rectangle<\/b>.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\n \nclass Square(Rectangle):\n    def __init__(self, side):\n        super().__init__(side, side)\n<\/code><\/pre>\n<p>Come potete vedere, la <a href=\"https:\/\/docs.python.org\/3\/library\/functions.html#super\" target=\"_blank\" rel=\"noopener noreferrer\">super funzione<\/a> passa il parametro <b>side<\/b> due volte alla <b>superclasse<\/b>. In altre parole, sta passando <b>side<\/b> sia come <b>side1<\/b> che come <b>side2<\/b> al costruttore precedentemente definito.<\/p>\n<h3>Classe Triangle<\/h3>\n<p>Un triangolo \u00e8 grande la met\u00e0 del rettangolo che lo circonda.<\/p>\n<figure style=\"width: 300px\" class=\"wp-caption alignnone\"><a style=\"font-size: 1rem\" href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Triangle-formula.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Triangle-formula.png\" alt=\"Relazione tra triangoli e rettangoli\" width=\"300\" height=\"200\"><\/a><figcaption class=\"wp-caption-text\">Relazione tra triangoli e rettangoli (Fonte immagine: Varsity tutors).<\/figcaption><\/figure>\n<p>Possiamo quindi ereditare dalla classe <b>Rectangle <\/b> e modificare il metodo <b>get_area<\/b> per far corrispondere la formula dell&#8217;area del triangolo, che \u00e8 la met\u00e0 della base moltiplicata per l&#8217;altezza.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\n \nclass Triangle(Rectangle):\n    def __init__(self, base, height):\n        super().__init__(base, height)\n \n    def get_area(self):\n        area = super().get_area()\n        return area \/ 2\n<\/code><\/pre>\n<p>Un altro caso d&#8217;uso della funzione <b>super()<\/b> \u00e8 chiamare un metodo definito nella <b>superclasse<\/b> e memorizzare il risultato come variabile. Questo \u00e8 quello che succede con il metodo <b>get_area()<\/b>.<\/p>\n<h3>Classe Circle<\/h3>\n<p>Per trovare l&#8217;area del cerchio si usa la formula <b>\u03c0r\u00b2<\/b>, dove <b>r<\/b> \u00e8 il raggio del cerchio. Questo significa che dobbiamo modificare il metodo <b>get_area()<\/b> per implementare questa formula.<\/p>\n<p><b>Nota:<\/b> possiamo importare il valore approssimativo di <b>\u03c0<\/b> dal modulo math:<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\n \n# At the start of the file\nfrom math import pi\n \nclass Circle(Shape):\n    def __init__(self, radius):\n        self.radius = radius\n \n    def get_area(self):\n        return pi * (self.radius ** 2)\n<\/code><\/pre>\n<p>Il codice sopra definisce la classe <b>Circle<\/b>, che usa un diverso costruttore e metodi <b>get_area()<\/b>.<\/p>\n<p>Sebbene <b>Circle<\/b> erediti dalla classe <b>Shape<\/b>, potete ridefinire ogni singolo metodo e attribuirlo a vostro piacimento.<\/p>\n<h3>Classe Regular Hexagon<\/h3>\n<p>Abbiamo solo bisogno della lunghezza di un lato di un esagono regolare per calcolare la sua area. \u00c8 simile alla classe <b>Square<\/b>, dove passiamo solo un argomento al costruttore.<\/p>\n<figure style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Hexagon-formula.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-medium\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Hexagon-formula-300x165.png\" alt=\"Formula dell'area dell'esagono\" width=\"300\" height=\"165\"><\/a><figcaption class=\"wp-caption-text\">Formula dell&#8217;area dell&#8217;esagono (Fonte immagine: BYJU&#8217;S)<\/figcaption><\/figure>\n<p>Tuttavia, la formula \u00e8 abbastanza diversa, e implica l&#8217;uso di una radice quadrata. Ecco perch\u00e9 userete la funzione <b>sqrt()<\/b> del modulo math.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\nclass Circle(Shape): \u2026\n \n# Import square root\nfrom math import sqrt\n \nclass Hexagon(Rectangle):\n    \n    def get_area(self):\n        return (3 * sqrt(3) * self.side1 ** 2) \/ 2\n<\/code><\/pre>\n<h3>Testare le Nostre Classi<\/h3>\n<p>\u00c8 possibile entrare in una modalit\u00e0 interattiva quando si esegue un file Python usando un debugger. Il modo pi\u00f9 semplice per farlo \u00e8 usare la funzione integrata <a href=\"https:\/\/docs.python.org\/3\/library\/functions.html#breakpoint\" target=\"_blank\" rel=\"noopener noreferrer\">breakpoint<\/a>.<\/p>\n<p><b>Nota: <\/b>questa funzione \u00e8 disponibile solo in Python 3.7 o nelle versioni pi\u00f9 recenti.<\/p>\n<pre><code class=\"language-python\">from math import pi, sqrt\n# Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\nclass Circle(Shape): \u2026\nclass Hexagon(Rectangle): \u2026\n \nbreakpoint()\n<\/code><\/pre>\n<p>Ora eseguite il file Python e giocate con le classi che avete creato.<\/p>\n<pre><code class=\"language-python\">$ python calculator.py\n \n(Pdb) rec = Rectangle(1, 2)(Pdb) print(rec)\nThe area of this Rectangle is: 2\n(Pdb) sqr = Square(4)\n(Pdb) print(sqr)\nThe area of this Square is: 16\n(Pdb) tri = Triangle(2, 3)\n(Pdb) print(tri)\nThe area of this Triangle is: 3.0\n(Pdb) cir = Circle(4)\n(Pdb) print(cir)\nThe area of this Circle is: 50.26548245743669\n(Pdb) hex = Hexagon(3)\n(Pdb) print(hex)\nThe area of this Hexagon is: 23.382685902179844\n<\/code><\/pre>\n<h3>Esercizio<\/h3>\n<p>Create una classe con un metodo <b>run<\/b> dove l&#8217;utente pu\u00f2 scegliere una forma e calcolarne l\u2019area.<\/p>\n<p>Quando avete completato l&#8217;esercizio, potete inviare una richiesta di pull al repo <a href=\"https:\/\/kinsta.com\/it\/blog\/git-contro-github\/\">GitHub<\/a> o pubblicare la vostra soluzione nella sezione dei commenti.<\/p>\n\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=vmNem6wxfSQ\"><\/kinsta-video>\n<h2>Riepilogo<\/h2>\n<p>La programmazione orientata agli oggetti \u00e8 un paradigma in cui risolviamo i problemi pensando a essi come a <b>oggetti<\/b>. Se capite la OOP di Python, potete anche applicarla facilmente in linguaggi come <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/#java\">Java<\/a>, <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-php\/\">PHP<\/a>, Javascript, e <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/#c-1\">C#<\/a>.<\/p>\n<p>In questo articolo, avete imparato a conoscere:<\/p>\n<ul>\n<li>Il concetto di orientamento agli oggetti in Python<\/li>\n<li>Svantaggi della programmazione orientata agli oggetti rispetto a quella strutturata<\/li>\n<li>Fondamenti della programmazione orientata agli oggetti in Python<\/li>\n<li>Concetto di <b>classi<\/b> e come usarle in Python<\/li>\n<li>Il <b>costruttore<\/b> di una classe in Python<\/li>\n<li><b>Metodi<\/b> e <b>attributi<\/b> in Python<\/li>\n<li>I quattro pilastri della OOP<\/li>\n<li>Implementazione di <b>astrazione<\/b>, <b>ereditariet\u00e0<\/b> e <b>polimorfismo<\/b> in un progetto<\/li>\n<\/ul>\n<p>Ora tocca a voi!<\/p>\n<p>Se vi \u00e8 piaciuta questa guida, date un&#8217;occhiata al nostro articolo sui <a href=\"https:\/\/kinsta.com\/it\/blog\/tutorial-python\/\">tutorial di Python<\/a>.<\/p>\n<p><em>Fateci sapere la vostra soluzione dell&#8217;esercizio, scrivetela nei commenti! E non dimenticate di leggere la nostra <a href=\"https:\/\/kinsta.com\/it\/blog\/php-vs-python\/\">guida al confronto tra Python e PHP<\/a>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La programmazione \u00e8 un&#8217;arte. E come nell&#8217;arte, selezionare i pennelli e i colori adeguati \u00e8 essenziale per produrre le opere migliori. La programmazione orientata agli oggetti &#8230;<\/p>\n","protected":false},"author":181,"featured_media":46394,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[25633,25596],"topic":[26215],"class_list":["post-46393","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-programmazione","tag-python","topic-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)<\/title>\n<meta name=\"description\" content=\"Scopri i pro e i contro della programmazione orientata agli oggetti (OOP) con Python. Andremo dal concetto all&#039;implementazione.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)\" \/>\n<meta property=\"og:description\" content=\"Scopri i pro e i contro della programmazione orientata agli oggetti (OOP) con Python. Andremo dal concetto all&#039;implementazione.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-17T07:40:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-07T10:13:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Daniel Diaz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Scopri i pro e i contro della programmazione orientata agli oggetti (OOP) con Python. Andremo dal concetto all&#039;implementazione.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg\" \/>\n<meta name=\"twitter:creator\" content=\"@DaniDiazTech\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Diaz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/\"},\"author\":{\"name\":\"Daniel Diaz\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2\"},\"headline\":\"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)\",\"datePublished\":\"2021-07-17T07:40:56+00:00\",\"dateModified\":\"2023-06-07T10:13:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/\"},\"wordCount\":3461,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg\",\"keywords\":[\"programmazione\",\"python\"],\"articleSection\":[\"Sviluppo Web\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/\",\"name\":\"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg\",\"datePublished\":\"2021-07-17T07:40:56+00:00\",\"dateModified\":\"2023-06-07T10:13:21+00:00\",\"description\":\"Scopri i pro e i contro della programmazione orientata agli oggetti (OOP) con Python. Andremo dal concetto all'implementazione.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2\",\"name\":\"Daniel Diaz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g\",\"caption\":\"Daniel Diaz\"},\"description\":\"Daniel is a self-taught Python Developer, Technical Writer, and long-life learner. He enjoys creating software from scratch and explaining this process through stunning articles. Follow him on Twitter: @DaniDiazTech\",\"sameAs\":[\"https:\/\/developerroad.herokuapp.com\/\",\"https:\/\/www.linkedin.com\/in\/danidiaztech\",\"https:\/\/x.com\/DaniDiazTech\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/danidiaztech\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)","description":"Scopri i pro e i contro della programmazione orientata agli oggetti (OOP) con Python. Andremo dal concetto all'implementazione.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/","og_locale":"it_IT","og_type":"article","og_title":"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)","og_description":"Scopri i pro e i contro della programmazione orientata agli oggetti (OOP) con Python. Andremo dal concetto all'implementazione.","og_url":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2021-07-17T07:40:56+00:00","article_modified_time":"2023-06-07T10:13:21+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg","type":"image\/jpeg"}],"author":"Daniel Diaz","twitter_card":"summary_large_image","twitter_description":"Scopri i pro e i contro della programmazione orientata agli oggetti (OOP) con Python. Andremo dal concetto all'implementazione.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg","twitter_creator":"@DaniDiazTech","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Daniel Diaz","Tempo di lettura stimato":"19 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/"},"author":{"name":"Daniel Diaz","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2"},"headline":"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)","datePublished":"2021-07-17T07:40:56+00:00","dateModified":"2023-06-07T10:13:21+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/"},"wordCount":3461,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg","keywords":["programmazione","python"],"articleSection":["Sviluppo Web"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/","url":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/","name":"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg","datePublished":"2021-07-17T07:40:56+00:00","dateModified":"2023-06-07T10:13:21+00:00","description":"Scopri i pro e i contro della programmazione orientata agli oggetti (OOP) con Python. Andremo dal concetto all'implementazione.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/07\/python-object-oriented-programming.jpeg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/kinsta.com\/it\/argomenti\/python\/"},{"@type":"ListItem","position":3,"name":"Guida Introduttiva alla Programmazione Orientata agli Oggetti con Python (OOP)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2","name":"Daniel Diaz","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g","caption":"Daniel Diaz"},"description":"Daniel is a self-taught Python Developer, Technical Writer, and long-life learner. He enjoys creating software from scratch and explaining this process through stunning articles. Follow him on Twitter: @DaniDiazTech","sameAs":["https:\/\/developerroad.herokuapp.com\/","https:\/\/www.linkedin.com\/in\/danidiaztech","https:\/\/x.com\/DaniDiazTech"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/danidiaztech\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/46393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/181"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=46393"}],"version-history":[{"count":17,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/46393\/revisions"}],"predecessor-version":[{"id":69919,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/46393\/revisions\/69919"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/translations\/pt"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/translations\/nl"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/translations\/de"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/translations\/se"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/46393\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/46394"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=46393"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=46393"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=46393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}