Fondamenti di Programmazione



Похожие документы
Introduzione all' OO in Python

Modulo 4: Ereditarietà, interfacce e clonazione

Parola chiave extends

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Programmazione a Oggetti Lezione 10. Ereditarieta

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione II. Lezione 4. Daniele Sgandurra 30/09/2011.

Traduzione e adattamento a cura di Gylas per Giochi Rari

Laboratorio di Informatica

Calcolare il massimo di una lista

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Traduzione e adattamento a cura di Gylas per Giochi Rari Versione 1.0 Luglio giochirari@giochirari.

costruttori e distruttori

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Soluzione dell esercizio del 2 Febbraio 2004

progettare buone gerarchie

Programmazione ad Oggetti: JAVA. Esercitazione

I file di dati. Unità didattica D1 1

da 2 a 5 giocatori, dai 10 anni in su, durata 30 minuti

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

SERVIZIO DI MESSAGGISTICA ALL UTENTE. Manuale per l operatore

Alcuni Design Pattern in Java

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

Fondamenti di Programmazione

Introduzione all uso di Eclipse

GESTIONE INFORMATICA DEI DATI AZIENDALI

Esempio: il conto bancario

ITIS Mattei Sondrio. Appunti veloci su moodle versione 2.7

REGOLE DA TORNEO DI DUEL MASTERS Valide dal 6 agosto 2004

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Simulazione traffico urbano

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

Introduzione al Python

Gestione Risorse Umane Web

Liberare la memoria allocata dinamicamente.

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Esercizi della lezione 5 di Java

Probabilità e bridge. Michele Impedovo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

7.4 Estrazione di materiale dal web

Corso di Programmazione ad Oggetti

PROGRAMMA GESTIONE TURNI MANUALE UTENTE. Programma Gestione Turni Manuale Utente versione 1.1

NOTA. La presente traduzione non sostituisce in alcun modo il regolamento originale del gioco.

Lezione 4. Modello EER


La struttura dati ad albero binario

Istruzioni per la configurazione di IziOzi

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

BLACK JACK. Come si gioca

Esercitazione di Basi di Dati

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Algebra Booleana ed Espressioni Booleane

Il modello EER comprende tutti i concetti di modellazione del modello ER, cui si aggiungono:

Introduzione al MATLAB c Parte 2

Regole del gioco UNO CONTENUTO DELLA CONFEZIONE: 108 Carte così distribuite: 19 Carte di colore Rosso che vanno dallo 0 al 9

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Istruzioni condizionali. Istruzioni condizionali IF-THEN- ELSE IF-THEN-ELSE. Statistica computazionale Carla Rampichini a.a.

ESTARWEB ISTRUZIONI SEZIONE DOCUMENTALE

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste

Organizzazione degli archivi

Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Regolamento In italiano

I COLORI DELLE CARTE ( SUITS )

G iochi con le carte 1

Autodesk Map parte III query

PYTHON CHEAT SHEET. Rapido documentazione di consultazione per istruzioni, funzioni e tipi in Python. #stampa le variabili x e y

Algoritmi di Ricerca. Esempi di programmi Java

DESIGN PATTERN CREAZIONALI INGEGNERIA DEL SOFTWARE INTRODUZIONE SINGLETON. Scopo dei design pattern creazionali

CONCETTO DI ANNIDAMENTO

Traccia di soluzione dell esercizio del 25/1/2005

Laboratorio di programmazione

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Introduzione a LyX. Creazione di un documento Struttura e stile Modelli di documento Automatismi Riferimenti...

Marco Faella Classi enumerate

Guida all uso di. a cura dell Area Economia Applicata (AEA) - IPI

CONTENT MANAGEMENT SY STEM

Università degli Studi di Napoli Federico II. FACOLTÀ DI INGEGNERIA Corso di Laurea in Ingegneria Informatica LM. Progetto di un applicazione Android

Il linguaggio SQL: query innestate

Test di unità con JUnit4

Parte 1. Vettori di bit - AA. 2012/13 1.1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Leggere un messaggio. Copyright 2009 Apogeo

FIRESHOP.NET. Gestione del taglia e colore.

Inizializzazione, Assegnamento e Distruzione di Classi

Modulo 3 - Elaborazione Testi 3.5 Stampa unione

ALBO PRETORIO WEB MANUALE DELLA PROCEDURA SOMMARIO. Uso del manuale. Informazioni generali. Interfaccia grafica. Guida di riferimento

Page 1. Evoluzione. Intelligenza Artificiale. Algoritmi Genetici. Evoluzione. Evoluzione: nomenclatura. Corrispondenze natura-calcolo

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS

Informatica Generale Andrea Corradini Sistemi di Gestione delle Basi di Dati

Guida per l utilizzo del software Registro Pazienti v1.2

Guida Rapida all uso del License Manager di ROCKEY4Smart (V )

Funzioni in C. Violetta Lonati

Транскрипт:

Fondamenti di Programmazione Capitolo 13 Programmazione Orientata agli Oggetti Prof. Mauro Gaspari: gaspari@cs.unibo.it

Ereditarietà L'ereditarietà (= inheritance) permette di definire nuove classi utilizzando una versione modificata di classi esistenti. La programmazione object based estesa con il concetto di ereditarietà si chiama orientata agli oggetti (= object oriented). In questo modo è possibile riutilizzare il codice già scritto: aggiungere nuovi metodi ad una classe senza modificare la struttura della classe esistente. In genere l'ereditarietà permette di ereditare i metodi e gli attributi definiti in una classe.

Ereditarietà in Python In Python si ereditano prevalentemente i metodi. Però ereditando il metodo init si ereditano anche gli attributi.

Una classe per le carte class Card: suitlist = ["Clubs", "Diamonds", "Hearts", "Spades"] ranklist = ["narf", "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"] def init (self, suit=0, rank=0): self.suit = suit self.rank = rank def str (self): return (self.ranklist[self.rank] + " of " + self.suitlist[self.suit])

Class Variables Notare che le variabili suitlist e ranklist non vengono inizializzate negli oggetti! Queste variabili si chiamano anche attributi di classe (= class variables/attributes), sono definiti fuori dai metodi e si possono accedere da tutti i metodi della classe.

Esempio: Attributi di Classe >>> card1 = Card(1, 11) >>> print card1 Jack of Diamonds >>> card2 = Card(1, 3) >>> print card2 3 of Diamonds >>> print card2.suitlist[1] Diamonds >>> card1.suitlist[1] = "Swirly Whales" >>> print card1 Jack of Swirly Whales >>> print card2 3 of Swirly Whales NB. si consiglia di non modificare attributi di classe

Confronto di carte def cmp (self, other): # check the suits if self.suit > other.suit: return 1 if self.suit < other.suit: return -1 # suits are the same... check ranks if self.rank > other.rank: return 1 if self.rank < other.rank: return -1 # ranks are the same... it's a tie return 0 Il metodo cmp può essere utilizzato per ottenere l'overloading dei gli operatori condizionali su tipi definiti dall'utente. Per convenzione cmp ha due argomenti: self, other e restituisce: 1: se il primo oggetto è più grande. 1: se il secondo oggetto è più grande. 0: se sono uguali.

Osservazioni Alcuni insiemi sono completamente ordinati: interi, foatingpoint. Altri insiemi sono senza ordine, ovvero non c'èun modo sensato per stabilire un ordine (ad esempio i tipi di frutta). Altri insiemi sono parzialmente ordinati: è possibile confrontare alcuni elementi ma altri no. Per definire cmp è opportuno che l'insieme sia completamente ordinato. Si è deciso che il segno è più importante del valore della carta.

Esempio: mazzo di carte class Deck: NB. append è un metodo def init (self): che funziona sulle liste e non self.cards = [] for suit in range(4): sulle tuple. for rank in range(1, 14): self.cards.append(card(suit, rank)) def str (self): s = "" for i in range(len(self.cards)): s = s + " "*i + str(self.cards[i]) + "\n" return s

Altri metodi def printdeck(self): for card in self.cards: print card seleziona un indice a caso nell'intervallo def shuffle(self): import random ncards = len(self.cards) for i in range(ncards): j = random.randrange(i, ncards) self.cards[i], self.cards[j] = self.cards[j], self.cards[i]

Altri metodi NB. utilizzo dell'operatore in con oggetti: se il primo argomento è un oggetto si utilizza il metodo cmp per testare l'appartenenza. def removecard(self, card): if card in self.cards: self.cards.remove(card) return 1 else: return 0

Altri metodi def popcard(self): return self.cards.pop() def isempty(self): return (len(self.cards) == 0)

Come riutilizzare il codice per definire il concetto di mano. class Hand(Deck): def init (self, name=""): self.cards = [] self.name = name def addcard(self,card) : self.cards.append(card) NB. il metodo removecard si eredita da Deck quindi non è necessario ridefinirlo.

Come dare le carte In quale classe inserire questo metodo? Sembra più naturale in Deck class Deck :... def deal(self, hands, ncards=999): nhands = len(hands) for i in range(ncards): if self.isempty(): break card = self.popcard() hand = hands[i % nhands] hand.addcard(card) Numero di persone a cui si danno le carte # break if out of cards # take the top card # whose turn is next? # add the card to the hand

Come stampare una mano? Si può riutilizzare il metodo definito per Deck che viene ereditato. >>> deck = Deck() >>> deck.shuffle() >>> hand = Hand("frank") >>> deck.deal([hand], 5) >>> print hand Hand frank contains 2 of Spades 3 of Spades 4 of Spades Ace of Hearts 9 of Clubs

Oppure si può definire un metodo più specifico. NB. una volta definito class Hand(Deck) questo metodo overrides... quello della classe Deck def str (self): s = "Hand " + self.name if self.isempty(): s = s + " is empty\n" else: s = s + " contains\n" return s + Deck. str (self) Si chiama il metodo della classe Deck si può fare perché una mano è anche un Deck

Osservazioni In genere è sempre possibile usare istanze di una sottoclasse al posto di istanze della sua superclasse. La notazione Classe.metodo si può utilizzare per forzare l'utilizzo di un metodo della superclasse quando c'è anche un metodo nella classe corrente (si applica il next method ).

Esempio: gioco di carte class CardGame: def init (self): self.deck = Deck() self.deck.shuffle() NB. questo è il primo caso in cui la init fa anche un calcolo, ovvero mescola il mazzo.

Osservazioni Questa classe rappresenta un gioco generico. Posso realizzare giochi specifici ereditando da questa classe.

Esempio: uomo nero class OldMaidHand(Hand): segno dello stesso def removematches(self): colore count = 0 originalcards = self.cards[:] for card in originalcards: match = Card(3 card.suit, card.rank) if match in self.cards: self.cards.remove(card) self.cards.remove(match) print "Hand %s: %s matches %s" % (self.name,card,match) count = count + 1 return count

>>> game = CardGame() >>> hand = OldMaidHand("frank") >>> game.deck.deal([hand], 13) >>> print hand Hand frank contains Ace of Spades 2 of Diamonds 7 of Spades 8 of Clubs 6 of Hearts 8 of Spades 7 of Clubs Queen of Clubs 7 of Diamonds 5 of Clubs Jack of Diamonds 10 of Diamonds 10 of Hearts Esempio di uso NB. il metodo init è ereditato dalla classe Hand

Esempio di match >>> hand.removematches() Hand frank: 7 of Spades matches 7 of Clubs Hand frank: 8 of Spades matches 8 of Clubs Hand frank: 10 of Diamonds matches 10 of Hearts >>> print hand Hand frank contains Ace of Spades 2 of Diamonds 6 of Hearts Queen of Clubs 7 of Diamonds 5 of Clubs Jack of Diamonds

Classe oldmaidgame oldmadegame è una sottoclasse di cardgame. in più si definisce un metodo play che prende come parametro il numero di giocatori. dato che init è ereditata da cardgame il nuovo gioco parte con un mazzo già mescolato.

class OldMaidGame(CardGame): def play(self, names): self.deck.removecard(card(0,12)) # remove Queen of Clubs self.hands = [] # make a hand for each player for name in names : self.hands.append(oldmaidhand(name)) self.deck.deal(self.hands) # deal the cards print "---------- Cards have been dealt" self.printhands() matches = self.removeallmatches() # remove initial matches print "---------- Matches discarded, play begins" self.printhands() turn = 0 # play until all 50 cards are matched numhands = len(self.hands) while matches < 25: matches = matches + self.playoneturn(turn) turn = (turn + 1) % numhands print "---------- Game is Over" self.printhands()

Remove all matches class OldMaidGame(CardGame):... def removeallmatches(self): count = 0 for hand in self.hands: count = count + hand.removematches() return count

play One Turn class OldMaidGame(CardGame):... def playoneturn(self, i): if self.hands[i].isempty(): return 0 neighbor = self.findneighbor(i) pickedcard = self.hands[neighbor].popcard() self.hands[i].addcard(pickedcard) print "Hand", self.hands[i].name, "picked", pickedcard count = self.hands[i].removematches() self.hands[i].shuffle() return count

find Neighbor class OldMaidGame(CardGame):... def findneighbor(self, i): numhands = len(self.hands) for next in range(1,numhands): neighbor = (i + next) % numhands if not self.hands[neighbor].isempty(): return neighbor

Esempio di partita >>> import cards >>> game = cards.oldmaidgame() >>> game.play(["allen","jeff","chris"]) ---------- Cards have been dealt È opportuno creare un modulo con le definizioni appena date. Per farlo è necessario salvarle in un file che supponiamo essere: cards.py. Questo file si può caricare con la primitiva import se si trova nella directory corrente.