Objectgericht Programmeren (in Python)
Motivatie Programmeren is moeilijk
Waarom? Complexiteit 100 200 300 400 500 kloc (1000 lijnen code)
g1 = raw_input("eerste getal?") g2 = raw_input("tweede getal?") m = int(g1) n = int(g2) r = m % n while r > 0: m = n n = r r = m % n print "GGD is " + str(n) m n r 70 42 28 42 28 14 28 14 0 Eerste getal?70 Tweede getal?42 GGD is 14
g1 = raw_input("eerste getal?") g2 = raw_input("tweede getal?") m = int(g1) Eerste getal?70 Tweede getal?42 GGD is 14 = -1*70 + 2*42 n = int(g2) a2 = 1 b = 1 a = 0 b2 = 0 c = m d = n q = c / d r = c % d a2 b a b2 c d q r while r > 0: c = d d = r t = a2 1 0 1-1 0 1 0 1 70 42 42 28 1 1 28 14 a2 = a a = t - q * a t = b2 b2 = b b = t - q * b q = c / d r = c % d 1 2-1 -1 28 14 2 0 print "ggd = "+str(d)+" = "+str(a)+"*"+str(m)+" + "+str(b)+"*"+str(n)
Waarom? Complexiteit 100 200 300 400 500 kloc (1000 lijnen code)
(Oude) oplossing Datastructuren Gegevens bijhouden Functies Gegevens manipuleren Zoals wiskundige stelling: wat onafhankelijk van hoe
Bijvoorbeeld Datastructuur Verhouding ingredienten Functie Hoeveel gin per tonic
Bijvoorbeeld Datastructuur verhouding = 0.5 Functie def ginpertonic(data, tonic): gin = data * tonic return gin
Bijvoorbeeld Datastructuur gintonic = { "gin": 0.33, "tonic": 0.67 } Functie def ginpertonic(data, tonic): cocktail = tonic / data["tonic"] gin = cocktail * data["gin"] return gin
Maar let op Datastructuur gintonic = { "gin": 0.33, "tonic": 0.67 } Functie def ginpertonic(verhouding, tonic): gin = verhouding * tonic return gin
RIP -$327.600.000
(Nieuwe) oplossing Datastructuren Gegevens bijhouden Functies Objecten Gegevens manipuleren
Object = Gegevens + Gedragen = Kennen + Kunnen
± het idee gintonic = { "gin": 0.33, "tonic": 0.67, "functie": ginpertonic1 } def ginpertonic1(data, tonic): cocktail = tonic / gintonic["tonic"] gin = cocktail * cocktail["gin"] return gin
± het idee gintonic = { "gin": 1, "tonic": 2, "functie": ginpertonic2 } def ginpertonic2(data, tonic): totaal = gintonic["gin"] + gintonic["tonic"] cocktail = tonic / gintonic["tonic"] gin = cocktail * cocktail["gin"] return gin / totaal
Voordeel gintonic = { "gin": 1, "tonic": 2, "functie": ginpertonic2 } gintonic["functie"](gintonic, 20) Zoals wiskundige stelling: wat onafhankelijk van hoe gintonic = { "gin": 0.33, "tonic": 0.67, "functie": ginpertonic1 } gintonic["functie"](gintonic, 20)
Klasse = Soort object
Illustratie Object aanmaken Attributen toevoegen en opvragen Object kan verschillende namen hebben
Object met functie class Rechthoek: pass x = Rechthoek() x.breedte = 4 x.hoogte = 5 def oppervlakte(rechthoek): return (rechthoek.breedte * rechthoek.hoogte) print oppervlakte(x)
Methode = functie in klasse class Rechthoek: def oppervlakte(zelf): return (zelf.breedte * zelf.hoogte) x = Rechthoek() x.breedte = 4 x.hoogte = 5 print x.oppervlakte() gintonic["functie"](gintonic, 20)
Methode = functie in klasse class Vierkant: def oppervlakte(zelf): return zelf.lengte ** 2 x = Vierkant() x.lengte = 4 print x.oppervlakte()
class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte class Vierkant: def oppervlakte(zelf): return zelf.lengte ** 2 x = Rechthoek() x.breedte = 4 x.hoogte = 5 y = Vierkant() y.lengte = 4 rij = [x,y] for figuur in rij: print figuur.oppervlakte()
class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte x = Rechthoek() x.breedte = 4 x.hoogte = 5 y = Rechthoek() y.breedte = 2 y.hoogte = 3 z = Rechthoek() z.breedte = 10 z.hoogte = 15
class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def initializeer(zelf,b,h): zelf.breedte = b zelf.hoogte = h x = Rechthoek() x.initializeer(4,5) y = Rechthoek() y.initializeer(2,3) z = Rechthoek() z.initializeer(10,25)
class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def init (zelf,b,h): zelf.breedte = b zelf.hoogte = h x = Rechthoek(4,5) y = Rechthoek(2,3) z = Rechthoek(10,25)
Constructor Wordt automatisch opgeroepen bij aanmaken van object Heeft atijd naam init Magische methode : dinges Bijkomend voordeel: daar kan je zien welke attributen object heeft
Magische methodes int(x) ---> x. int () float(x) ---> x. float () str(x) ---> x. str () print x ---> x. str ()
class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def init (zelf,b,h): zelf.breedte = b zelf.hoogte = h >>> x = Rechthoek(4,5) >>> int(x) 20 >>> str(x) 'Rechthoek van 4x5' >>> print x Rechthoek van 4x5 def str (zelf): return ("Rechthoek van " + str(zelf.breedte) + "x" + str(zelf.hoogte)) def int (zelf): return zelf.oppervlakte()
Magische attributen >>> x = Rechthoek(1,2) >>> x. class <class main.rechthoek at 0x505930> >>> x. dict {'breedte': 1, 'hoogte': 2} >>> x. class. dict {' int ': <function int at 0x511030>, ' module ': ' main ', ' str ': <function str at 0x5061b0>, 'oppervlakte': <function oppervlakte at 0x503470>, ' doc ': None, ' init ': <function init at 0x5034f0>}
En wat met ons probleem? Complexiteit 100 200 300 400 500 kloc (1000 lijnen code)
class Rechthoek: Inkapseling def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def init (zelf,b,h): zelf.breedte = b zelf.hoogte = h def str (zelf): return ("Rechthoek van " + str(zelf.breedte) + "x" + str(zelf.hoogte))
class Rechthoek: Inkapseling def oppervlakte(zelf): return zelf.opp def init (zelf,b,h): zelf.breedte = b zelf.opp = b * h def str (zelf): return ("Rechthoek van " + str(zelf.breedte) + "x" + str(zelf.opp / zelf.breedte))
class Rechthoek: Inkapseling def oppervlakte(zelf): def init (zelf,b,h): def str (zelf):
Praktisch Email: joost.vennekens@kuleuven.be Slides downloaden: http://www.cs.kuleuven.be/~joost/dn/ Schriftelijk examen (40%) + 25% P.E. practica + 20% website + 15% Netwerken