Inleiding Programmeren 2 Gertjan van Noord, Leonie Bosveld 12 december 2016
Zelle hoofdstuk 10 Stof
Overzicht - theorie 1. Zelle hoofdstuk 4 en 5 2. Zelle hoofdstuk 7 en 8, recursie, Brookshear hoofdstuk 5 3. Zelle hoofdstuk 8, recursie, tuples en sets, complexiteit Brookshear hoofdstuk 5 4. Zelle hoofdstuk 9, simulatie 5. Zelle hoofdstuk 10, object oriented programming, Brookshear hoofdstuk 6 6. Zelle hoofdstuk 11 7. Vragenuur, bekijken proeftentamen
Syracuse def syracuse (x) : """ returns the Syracuse sequence of x """ if x ==1 : return [x] if x % 2 == 0 : n = x //2 else : n = 3 * x + 1 return [x] + syracuse (n)
Definieren van nieuwe klassen Een object: Informatie die bij elkaar hoort ( instance variables ) Met bijbehorende operaties ( methods ) Attributen van een object: de instance variables en de methods Elk object is de instance van een class Je maakt een nieuw object met een constructor
Bijvoorbeeld: Circle mycircle = Circle(Point(0,0), 20) Dit maakt een nieuw object van de class Circle De parameters worden gebruikt om sommige instance variables te initializeren Als het object is gemaakt, kun je de methods gebruiken mycircle. draw ( win ) mycircle. move (10,10)
Zelf classes definieren class voor een meerzijdige dobbelsteen (die/dice) informatie Hoeveel zijden heeft de dobbelsteen Wat is de huige waarde van de dobbelsteen methoden roll een nieuwe worp get de waarde set de waarde
class MSDie class MSDie : def init (self, sides ): self. sides = sides self. value = 1 def roll ( self ): self. value = randrange (1, self. sides +1) def getvalue ( self ): return self. value def setvalue (self, val ): self. value = val
Waarom self De parameter self verwijst in de definitie van een klasse steeds naar een specifieke instantie. Als je de constructor gebruikt om een MSDie object te bouwen, verwijst self dus naar het object dat je aan het bouwen bent. Als je de getvalue methode gebruikt van een gegeven MSDie object, dan verwijst self naar datzelfde object.
Hoe bepaal je de attributen? Hoe wil je het object gebruiken? Zorg dat de buitenwereld zo min mogelijk hoeft te weten over de interne structuur van het object encapsulation Bijvoorbeeld: als je een betere random module ter beschikking hebt, kun je de klasse aanpasssen, zonder de methoden aan te hoeven passen De buitenwereld moet weten wat het object kan, maar ze hoeven niet te weten hoe alles is geimplementeerd. Dus wel wat, maar niet hoe.
Methoden en instance variabelen from MSDie import MSDie ds1 = MSDie (6) ds1. roll () print ( ds1. getvalue ()) 4 print ( ds1. value )?
Methoden en instance variabelen from MSDie import MSDie ds1 = MSDie (6) ds1. roll () print ( ds1. getvalue ()) 4 print ( ds1. value ) 4
Methoden en instance variabelen In Python kan/mag dit allebei In sommige andere talen kan/mag je alleen via methoden de instance variabelen benaderen Dat wordt (meestal) beschouwd als de nettere oplossing Instance variables die je als private beschouwt, hebben vaak een naam die met een underscore begint Speciale methode str(self) om je object als string weer te geven
Een alternatieve klasse voor meerzijdige dobbelstenen class MSDie : def init (self, sides ): self. sides = sides self. value = 1 def roll ( self ): self. value = randrange (1, self. sides +1) return self. value def str ( self ): return "<MSDie met {} zijden >". format ( self. sides ) Wat zijn de verschillen?
Nog eentje class MSDie : def init (self, sides ): self. sides = sides def roll ( self ): return randrange (1, self. sides +1) def str ( self ): return "<MSDie met {} zijden >". format ( self. sides )
Inheritance Klassen kunnen worden gedefinieerd in termen van algemenere klassen Methoden en attributen worden overgeerfd van die algemenere klassen
Inheritance class Triangle ( Polygon ): def init (self, p1, p2, p3 ): Polygon. init (self,p1,p2,p3) Als je in graphics.py kijkt, zie je dat Polygon zelf ook weer een sub-klasse is van GraphicsObject. Op deze manier kan een hierarchy van klassen ontstaan. Zo n hierarchy wordt vaak Inheritance hierarchy genoemd.
Inheritance hierarchy
Woordenboek als een inheritance hierarchy wat is bijbehorende lemma wat is de woordsoort (werkwoord, zelfstandig naamwoord, voornaamwoord, voorzetsel) werkwoorden kunnen vervoegd zijn vervoegde werkwoorden zijn ofwel tegenwoordige tijd ofwel verleden tijd zelfstandige naamwoorden hebben getal (enkelvoud of meervoud) etc etc
Implementatie van de dikke van Dale class Word : def init (self,word, lemma ): self. word = word self. lemma = lemma def Lemma ( self ): return self. lemma class Noun ( Word ): def init (self,word, lemma ): Word. init (self,word, lemma ) self. part_of_speech = noun def getnumber ( self ): return self. number class PluralNoun ( Noun ): def init (self,word, lemma ): Noun. init (self,word, lemma ) self. number = plural
Dictionary to look up properties of words
Multiple inheritance Je kunt ook van meerdere klassen overerven. class WhPossPron ( WhPronoun, Determiner ):...