Objectgericht Programmeren (in Python)
Motivatie
Programmeren is moeilijk
Complexiteit
Waarom?
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)
Eerste getal?70 Tweede getal?42 GGD is 14
m
n
r
70
42
28
42
28
14
28
14
0
g1 = raw_input("Eerste getal?")! g2 = raw_input("Tweede getal?")! m = int(g1)! n = int(g2)! a2 = 1! b = 1! a = 0! b2 = 0! c = m! d = n! q = c / d! a2 b a b2 c d q r r = c % d! while r > 0:! 1 1 0 0 70 42 1 28 c = d! d = r! 0 -1 1 1 42 28 1 14 t = a2! a2 = a! 1 2 -1 -1 28 14 2 0 a = t - q * a! t = b2! b2 = b! b = t - q * b! q = c / d! r = c % d! print "ggd = "+str(d)+" = "+str(a)+"*"+str(m)+" + "+str(b)+"*"+str(n)
Eerste getal?70 Tweede getal?42 GGD is 14 = -1*70 + 2*42
Complexiteit
Waarom?
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! • Gegevens manipuleren
Objecten
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
! !
>>> x = Rechthoek(4,5)! __init__(zelf,b,h):!>>> int(x)! zelf.breedte = b! 20! zelf.hoogte = h! >>> 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__!
! >>> x.__dict__! {'breedte': 1, 'hoogte': 2}! >>> x.__class__.__dict__! {'__int__': , '__module__': '__main__', '__str__': , 'oppervlakte': , '__doc__': None, '__init__': }!
Complexiteit
En wat met ons probleem?
100
200
300
400
500
kLOC (1000 lijnen code)
Inkapseling class Rechthoek: ! !
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))
Inkapseling class Rechthoek: ! !
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))
Inkapseling class Rechthoek: ! !
def oppervlakte(zelf):! ! !
def __init__(zelf,b,h):! ! ! !
def __str__(zelf):! ! !
Praktisch • Email:
[email protected]! • Slides downloaden:
http://www.cs.kuleuven.be/~joost/DN/! • Schriftelijk examen (40%)
+ 25% P.E. practica + 20% website
+ 15% Netwerken