Python programming

programmazione
in Python

Dipartimento di Informatica
I.I.S. "Blaise Pascal" - Reggio Emilia

Programmazione in Python

OOP

Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Programmazione in Python

Programmazione a oggetti

in python tutto è un oggetto di classe

lo stesso type di un elemento è una classe

Definizione di classe

# la classe minima
class Oggetto:
    pass
Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Programmazione in Python

Definizione di classe

class Punto:
    __x = None  # per convenzione attributi "privati"
    __y = None

    def __init__(self, x, y):
        self.__x = x
        self.__y = y

p = Punto(1, 4)
print(p)
print(p.__dict__)
<__main__.Punto object at 0x7f13c9e574c0>
{'_Punto__x': 1, '_Punto__y': 4}
Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Programmazione in Python

Definizione di classe

class Punto:
    __x = None  # per convenzione attributi "privati"
    __y = None

    def __init__(self, x, y):
        self.__x = x
        self.__y = y

    def setX(self, x):
        self.__x = x

    def getX(self):
        return self.__x

p = Punto(1, 4)
print(p.getX())
p.setX(10)
print(p.getX())
1
10
Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Programmazione in Python

Si può far meglio

  • pythonic setter e getter
class Persona:
    _age = None # per convenzione attributi "privati"
    _name = None

    def __init__(self, a, p):
        self._age = a
        self._name = p

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, v):
        self._age = v

p1 = Persona(30, "Marco")
print(p1)
print(p1.__dict__)
print(p1.age)
p1.age=35
print(p1.__dict__)
print(p1.age)
<__main__.Persona object at 0x7f0e69831f40>
{'_age': 30, '_name': 'Marco'}
30
{'_age': 35, '_name': 'Marco'}
35
Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Programmazione in Python

primo step di esercizi

  • Crea la classe NumeroRazionale per modellizzare il comportamento di un numero razionale
  • Utilizza i seguenti attributi privati
    • __numeratore
    • __denominatore
  • Crea i seguenti metodi di classe
    • costruttore(int, int) -> void
    • get_valore_reale() -> float
    • get_inverso() -> NumeroRazionale
    • riduci_minimi_termini() -> void
  • Crea un main di test per provare tutti i metodi della classe

15 minuti per lavorare!!!

Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Una soluzione

class NumeroRazionale:
    __numeratore = None
    __denominatore = None

    def __init__(self, n, d):
        if not isinstance(n, int): 
            raise Exception("valore non valido per numeratore ")
        if not isinstance(d, int): 
            raise Exception("valore non valido per denominatore ")
        if d == 0:
            raise Exception("valore 0 non valido per denominatore ")
        self.__numeratore = n
        self.__denominatore = d

    def get_valore_reale(self):
        return float(self.__numeratore)/self.__denominatore

    def get_inverso(self):
        return NumeroRazionale(self.__denominatore, self.__numeratore)

    def riduci_minimi_termini(self):
        for i in range(2, min(self.__numeratore, self.__denominatore)+1):
            if self.__numeratore%i == 0 and self.__denominatore%i == 0:
                self.__numeratore = int(self.__numeratore/i)
                self.__denominatore = int(self.__denominatore/i)

    def __repr__(self):
        return f"[{self.__numeratore}/{self.__denominatore}]"
Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Una soluzione - main di test

nr = NumeroRazionale(2, 3)
print(nr)
print(nr.get_valore_reale())
print("==========================")
nr2 = NumeroRazionale(4, 6)
print(nr.get_valore_reale())
print(nr2)
nr2.riduci_minimi_termini()
print(nr2)
print(nr.get_valore_reale())
print("==========================")
try:
    nr3 = NumeroRazionale(4, 0)
except Exception as e:
    print("Errore rilevato : ", e)
nr4 = NumeroRazionale(3, 8)
nr5 = nr4.get_inverso()
print("Inverso di ", nr4 , "è", nr5)

tasto centrale per scaricare il sorgente

Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Programmazione in Python

secondo step di esercizi

  • Crea una classe Amico per memorizzare nome e numero di telefono di una persona
  • Crea una classe Rubrica che gestisca una lista di Amico con i seguenti metodi
    • add_amico(Amico) -> void
    • get_amico(string) -> Amico|None
    • upd_amico(string nome, string numero) -> void
    • get_all() -> [list of Amico]
  • Crea un main di test per provare tutti i metodi della classe

15 minuti per lavorare!!!

tasto centrale per scaricare il sorgente

Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Programmazione in Python

terzo step di esercizi

  • Sia dato il file prodotti.csv il cui contenuto è il seguente
codice,descrizione,costo,giacenza
001,Mouse,9.99,4
002,Tastiera,19.99,5
003,Monitor,79.99,8

## PER IMPORTARE VIA CSV a DIZIONARIO
import csv
with open('prodotti.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile, delimiter=',')
    for row in reader:
        print(row)
  • Crea una classe Magazzino che gestisca una lista di Prodotto con i seguenti metodi

    • add_prodotto(Prodotto p, int giacenza) -> void
    • get_magazzino() -> list of Prodotto
    • get_giacenza(Prodotto p) -> int
  • Leggere il file prodotti.csv, parsare l'input, generare l'oggetto Prodotto e valorizzarlo con gli attributi indicati

  • Testare le funzioni sopra descritte con un programma esterno
Dipartimento di Informatica - I.I.S. "Blaise Pascal" - Reggio Emilia

Dipartimento di Informatica
I.I.S. "Blaise Pascal" - Reggio Emilia