Programmazione a Oggetti
1 - Codifiche e Decodifiche:
La codifica è l'insieme delle regole che permettono di associare simboli a configurazioni del supporto di memorizzazione e/o trasmissione.
In informatica, la codifica del testo ha sempre creato problemi.
Il codice ASCII è il codice alfanumerico più diffuso per lo scambio di informazioni fra sistemi di elaborazione (sono codificati solo le lettere dell'alfabeto inglese).
ASCII è codificato su 7 bit quindi può rappresentare al massimo 27=128 simboli. Esistono la versione ASCII estesa a 8 bit.
Per gestire caratteri speciali delle diverse lingue sono state create altre codifiche, molte fra loro incompatibili.
11100001 e un byte corrisponde alla memorizzazione di un carattere dell'alfabeto (formato da 8 bit).
La codifica UNICODE permette di codificare tutto (caratteri e simboli di tutte le lingue conosciute). Arriva ad usare fino a 4 byte per carattere (32 bit).
Una stringa di caratteri UNICODE necessita di una trasformazione per essere salvata e scambiata fra sistemi o interpretata da un browser. Questo processo è affidato ad un codec.
Un codec è un algoritmo che trasforma ogni carattere in Unicode restituendo il corrispondente sequenza di byte.
Esistono diversi codec compatibili con Unicode ma le maggiori porte lavorano con codifiche multipiattaforma utilizzanti vari caratteri.
UTF-8 (salva in 8 bit); UTF-16 (salva in 16 bit, quindi è un sottoinsieme di Unicode); Altri formati UTF.
Python codifica le stringhe in modo diverso a seconda delle versioni:
- Python 3 - Utilizza Unicode come standard
- Python 2 - Memorizza usando una codifica a 8 bit
- Stringhe memorizzate interamente come codice Unicode
- Una stringa proveniente dall'esterno è subito convertita in Unicode
- I problemi sono identificati in anticipo
- Stringhe memorizzate interamente come sequenze di 8 bit
- È necessario indicare la codifica utilizzata
- I problemi sono difficili da individuare
- L'uso del formato Unicode va richiesto esplicitamente
Il prima possibile bisogna cercare di convertire in Unicode tutto ciò che entra nello script.
Programmazione a Oggetti
1. Codifiche e Decodifiche:
La codifica è l'insieme delle regole che permettono di associare simboli a configurazioni di supporto di memorizzazione e/o trasmissione.
In informatica, la codifica del testo ha sempre creato problemi.
Il codice ASCII è il codice alfanumerico più diffuso per lo scambio di informazioni fra sistemi di elaborazione (sono codificati solo le lettere dell’alfabeto inglese (no accentate)). ASCII è codificato su 7 bit quindi può rappresentare al massimo 27=128 simboli diversi. La ASCII esteso è 1 bit.
Per gestire i caratteri speciali di diverse lingue sono state create altre codifiche, molte fra loro incompatibili.
11111111 è un byte e corrisponde alla memorizzazione di un carattere informatico (formato di 8 bit).
La codifica UNICODE promette di codificare tutto (caratteri e simboli di tutte le lingue conosciute). Arriva ad usare fino a 4 byte per carattere (=32 bit).
Una stringa di caratteri UNICODE necessita di una trasformazione per essere salvata e scambiata fra sistemi o interpretata da un browser. Questo processo è affidato ad un codec.
Un codec è un codice che trasforma un dato, un carattere in UNICODE, restituendo il corrispondente equivale a byte.
Esistono diversi codec compatibili con UNICODE. Il più maggior parte usa la lunghezza della codifica tuttavia sempre con caratteri.
UTF-8 (salva in 8 bit), UTF-16 (salva in 16 bit, quindi è un sottinsieme), Unicode permette diversi piani di UTF32.
Python codifica le stringhe in modo diverso a seconda delle versioni:
- PYTHON 3 utilizza Unicode come standard
- PYTHON 2 memorizza usando una codifica a 8 bit
- Stringhe memorizzate internamente come UNICODE
- Una stringa proveniente dall’esterno è subito convertita in UNICODE
- I problemi sono identificati in anticipo
- Stringhe memorizzate internamente come sequenze di 8 bit
- È necessario indicare la codifica utilizzata
- I problemi sono difficili da individuare
- L'uso del formato UNICODE va richiesto esplicitamente
Il prima possibile bisogna cercare di convertire in Unicode tutto ciò che entra nello script.
# CODING = UTF-8
La direttiva coding deve essere inserita nelle prime due righe
dello script. In assenza di direttiva PYTHON 2 utilizzo la codifica ASCII
La direttiva coding stabilisce come decodificare le variabili
create nello script. In base al come è stato codificato file scelgo quale
codifica applicare.
È possibile forzare Python 2 a memorizzare una stringa
in Unicode.
variabile1 = ciao
variabile2 = variabile1.decode('UTF-8')
variabile2 = 'ciao'.decode('UTF-8')
oppure
Python mette a disposizione la libreria codecs per aprire
file di testo con codifiche diverse dallo ASCII
import codecs
f = codecs.open('file.txt', 'r', encoding = 'latin1', errors='ignore')
f.close()
Permette di specificare
la codifica
Se il programma incontra
caratteri non riconosciuti
si comporta in maniera
differente in base a come
viene scritto nel parametro errors
parametro opzionale
- STRICT: il programma si blocca e genera un error
- IGNORE: caratteri non conosciusti sono eliminati
- REPLACE: viene sostituito un carattere speciale ai caratteri non
riconosciuti.
Si possono usare i metodi encode() e decode() per
gestire le conversioni dei parametri in ingresso/uscita di
una funzione o una libreria esterna.
chr() permette di passare da codice ASCII numerico in base 10
a carattere corrispondente
unichr() da codice UNICODE numerico in base 10 a carattere
corrispondente
ord() da carattere a codice numerico in base 10
I primi 256 caratteri UNICODE collocano con i corrispondenti
ASCII.
Nella rappresentazione UNICODE si usano numeri esadecimali:
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f). Una cifra esadecimale
rappresentato 4 bit = 24 combinazioni.
2. Programmazione ad Oggetti
OOP (Object-oriented Programming) è un paradigma di programmazione che prevede di risolvere i compiti con diversi oggetti che collaborano tra loro.
Ciascun oggetto ha un insieme di dati (attributi) e da operazioni (metodi) che può elaborare su loro.
Nella OOP si creano oggetti che rappresentano gli elementi importanti di un'applicazione/parti di una realtà.
Python dà la possibilità di impacchettare assieme dati e funzioni (che lavorano su dati) tra loro.
All'interno di una classe funzioni e variabili vengono chiamati rispettivamente metodi e attributi.
f = open("file1.txt", "r")
g = open("file2.txt", "w")
f e g sono due oggetti cioè 2 istanze della classe file.
Ogni oggetto eredità i metodi dalla classe, tuttavia i dati (valori degli attributi) sono gestiti separatamente.
La classe è un insieme di codice che contiene attributi e metodi.
Incapulamento
Il codice è diviso in interfaccia pubblica (metodi) e interfaccia privata (attributi)
Polimorfismo
Metodi con lo stesso nome, ma codo su oggetti diversi, comportano risultati differenti.
Ereditarietà
È possibile creare sottoclassi che modificano, specializzano estendono il codice contenuto nel genitore.
I metodi possono essere modificatori (se apportano modifiche all'oggetto su cui agiscono) o di solo accesso (se interrogano l'oggetto su cui agiscono per ottenere informazioni senza modificarlo).
Metodo Costruttore
class villetta:
def __init__(self, proprietario, indirizzo): self.p = proprietario # Attributo dell'oggetto self.indirizzo = indirizzo return "villetta di:", self.p, "in", self.indirizzo # serve per inizializzare le variabili dell'oggettoV1 = villetta("rossi", "corso Italia")
V1 è un'istanza della classe villetta
Il primo parametro di un metodo è sempre self
Attributi dell'oggetto
- Sono sempre referenziati utilizzando self
- Self è la variabile parametro che fa sempre automaticamente riferimento all'oggetto su cui il metodo è stato invocato
- Uno stesso attributo ed oggetto può avere valori diversi da un oggetto all'altro
Attributi di classe
- Per far riferimento agli attributi di classe si premette il nome della classe
- Gli attributi di classe sono condivisi tra tutti gli oggetti
Python ricorre all'escamotage del "riferimento": attraverso "self" per gli attributi dell'oggetto e attraverso il nome della classe per gli attributi di classe.
Nei parametri formali di una funzione possono essere inseriti anche dei parametri opzionali. Possono essere usati sia nelle funzioni che nei metodi degli oggetti.
L'ereditarietà rappresenta una relazione tra una superclasse e una sottoclasse. (sottoclasse) eredita dai (attributi) e il comportamento (metodi) della superclasse (classe padre).
Vantaggio dell'ereditarietà è quello di risparmiare/ristrutturare il codice permettendo di rappresentare oggetti aventi comportamenti diversi.
Spesso le durate possono essere espresse con una variabile di oggetto.
In Python si definisce una sottoclasse specificando cosa lo renda diverso dalla sua superclasse.
- I sottoclassi ereditano: tutte le variabili di oggetto e tutti i metodi che non si modificano
- Le sottoclassi possono aggiungere variabili nuove e metodi nuovi, metodi uguali ma da usare in modo particolarmente metodi ereditati.
- Bisogna: scrivere il metodo nella sottoclasse con stesso nome, stessi parametri, nuova implementazione diversa.
Overloading:
Non è ammesso in Python la creazione di un metodo con stesso nome e parametri diversi, ma esso si può simulare utilizzando parametri opzionali.
Overriding: Quando una classe figlia ridefinisce un metodo dalla classe padre.
Una classe può ereditare da più padri ed effettuare l'overriding.
Se 2 classi padre offrono un metodo col lo stesso nome viene scelta la classe padre che appare più a sinistra tra le ( ) nella dichiarazione della classe figlia.
L'insieme di tutti i metodi di una classe, con la descrizione del loro comportamento è l'interfaccia pubblica della classe.
L'incapsulamento mette a disposizione un'interfaccia pubblica, mantenendo nascosti i dettagli implementativi.
Si può evitare in caso di modifica di una classe, di modificare tutti i programmi che la utilizzano, tramite incapsulamento si creano dei metodi per accedere ai dati.
Si nascondono le strutture dati e/o le implementazioni sottostanti. L'obiettivo è forzare l'accesso ai dati attraverso i metodi dell'interfaccia.
"_" è usato per indicare attributi che saranno modificati a breve.
Al di fuori delle classe non sono visibili gli attributi/metodi i cui nomi iniziano con "__".
Metodi speciali:
- __str__(self) Restituisce una stringa contenente una rappresentazione in stringhe.
- __mul__(...) Permette di implementare l'operazione di moltiplicazione.
- __add__(...) Permette di implementare l'operazione di somma.
3. Eccezioni:
Un'eccezione è un evento accidentale (spesso un errore) che accade durante l'esecuzione di un programma, che interrompe il normale flusso di esecuzione.
Quando in uno script Python viene sollevata un'eccezione:
- Il programmatore può specificare del codice per gestire un'eccezione.
- Se il codice riesce a gestire l'eccezione, l'esecuzione del programma può continuare.
- Se l'eccezione non può essere gestita, l'esecuzione dello script viene interrotta.
Un'eccezione è rappresentata attraverso un oggetto Python. Si possono definire nuove eccezioni con le classi.
L'ultima riga di un messaggio di errore indica cosa è successo.
Le eccezioni sono di diversi tipi, ed il loro tipo viene stampato come parte del messaggio.
-
Appunti Laboratorio d'informatica di base
-
Temi d'esame anni precedenti Fondamenti d'informatica
-
Appunti completi di Laboratorio di Sperimentazione
-
Appunti Laboratorio di Misure