[14:24] Zo. [17:46] [18:30] Welkom allemaal, het is 19:30, dus laten we beginnen. [18:30] laten we beginnen met het huiswerk van vorige keer bespreken, voordat we in een nieuw onderwerp duiken [18:31] en daarvoor mag ik FOAD vandaag uitnodigen :) [18:31] Dank u, dank u. [18:31] Ik heb mijn poging op http://paste.ubuntu.com/582571/ geplaatst. Vergeef me de idiosyncratische tekst maar. [18:32] Eigenlijk gebeurt er niet zoveel, het programma doet letterlijk wat de opdracht vraag. Ik was wel zo eigenwijs om het ding zichzelf niet te laten uitvoeren. [18:32] En.. um. Klopt het? [18:32] mooi gebruik gemaakt van os.path [18:33] maar laat ik nog even een linkje geven naar het iets simpelere voorbeeld dat wij hebben gemaakt [18:33] FOAD, wil jij ondertussen deze regel even wat uitgebreider uitleggen? [18:33] Kun je uitleggen wat er gebeurt bij de oplossing van FOAD [18:33] FOAD? [18:33] if os.path.splitext( file )[ 1 ] == ".py" and os.path.realpath( sys.argv[ 0 ] ) != os.path.realpath( file ): [18:33] commandoline was mij voor [18:33] Natuurlijk. [18:34] Bedankt [18:34] http://paste.ubuntu.com/579221/, ondertussen [18:34] De if controleert 2 dingen: 1) of de extensie van het bestand "file" gelijk is aan py (dus, dat het (waarschijnlijk) een python bestand is. [18:35] Maar 2) ook of het bestand naar waar wordt gekeken niet toevallig het programma zelf is. De naam van het programma zelf vind je via sys.argv[ 0 ]. [18:35] Ik gebruik realpath om zeker te weten dat hij absolute paden vergelijkt. Ik weet eigenlijk niet zeker of het nodig is, maar ik denk het wel. [18:35] Moet ik dat nog verder toelichten? [18:35] DooitzedeJong> Wat betekent die != [18:36] DooitzedeJong> niet gelijk aan? [18:36] De reden dat ik dit doe is dat het programma niet zichzelf gaat aanroepen, want dan kan het zo lang gaan duren. [18:36] Inderdaad, DooitzedeJong [18:36] !- betekent "niet gelijk aan". [18:36] ok, bedankt voor de uitleg, FOAD. Heeft iemand idd nog vragen? [18:36] Eh, != [18:37] ok, dan gaan we verder [18:37] oh, nog een vraag [18:37] <DooitzedeJong> Wat moet je invullen.. [18:37] <DooitzedeJong> bij dir? [18:37] DooitzedeJong: de directory die je wilt scannen [18:37] Ik besef me wel dat + "/" + een beetje os-afhankelijk is. [18:37] DooitzedeJong: bijvoorbeeld ja [18:38] Alle .py bestanden in die dir zullen dan worden uitgevoerd [18:38] bijvoorbeeld /home ? [18:38] ^ [18:38] Al beantwoord ;) [18:39] OK, ik wil jullie vandaag wat leren over een andere manier van programma's ontwerpen [18:39] tot nu toe hebben jullie procedureel geprogrammeerd [18:40] je kunt met die manier van programmeren alles maken wat je ook kan met de methode die we vandaag gaan bespreken, maar daar wordt het niet altijd duidelijker op. [18:40] DooitzedeJong: al je programma's werden regel voor regel afgewerkt. [18:40] * altijd duidelijker van [18:41] |Wat houdt dat in| [18:41] ? [18:41] van 1 tot 10 het proces afhandelen? [18:41] was de vraag [18:41] Die is beantwoord [18:41] Ga verder [18:42] ho, hier wat verwarring, ok, verder [18:42] de methode die we gaan bespreken heet in het Engels 'Object Oriented Programming', kortweg OOP [18:44] de Nederlandse vertaling daarvan is Objectgeoriënteerd programmeren [18:45] deze manier van programmeren is dus gewoon een andere manier om tegen het probleem dat je programma moet oplossen aan te kijken [18:46] Voordat ik ga uitleggen hoe we die manier van programmeren toepassen in Python, wil ik jullie eerst proberen duidelijk te maken wat het hele concept inhoudt. [18:46] want pas als je dat begrijpt, kan je het toepassen in de praktijk [18:47] OK, zoals het woord al zegt, gaat objectgeoriënteerd programmeren over objecten [18:47] de eerste vraag om te stellen is dus: wat is een object? [18:48] objecten zoals je die gebruikt bij programmeren, lijken best sterk op objecten die je in de praktijk ziet [18:49] Laten we eens een voorbeeld nemen [18:50] Bijvoorbeeld een fiets [18:50] een object zoals je dat gebruikt bij OOP, heeft twee kenmerken: [18:51] - het object bevat handelingen (de zogenaamde methods) [18:51] - het object bevat eigenschappen (de zogenaamde properties in het Engels) [18:51] Het is ook mogelijk om die manier van kijken toe te passen op een object uit de praktijk, dus op het voorbeeld van de fiets. [18:51] een fiets heeft handelingen: [18:52] - versnelling veranderen [18:52] - remmen [18:52] - versnellen [18:52] hannie: ja dus ;) [18:52] ook heeft een fiets eigenschappen: [18:53] bijv. de huidige versnelling, en de huidige snelheid [18:53] het komt dus vaak voor, dat de handelingen die de fiets heeft de eigenschappen van de fiets veranderen. [18:53] je kan zo'n manier van kijken naar objecten op allerlei dingen die je ziet toepassen [18:54] is dit ongeveer duidelijk? Kunnen jullie je er wat bij voorstellen? [18:55] hmm, ik heb nog niet iedereen overtuigd [18:55] nog een voorbeeldje dan: [18:55] oh, het gaat alleen om toepassen in een programma, dan ga ik toch door [18:55] FOAD: daarom is dit nog conceptuele uitleg, en geen Pythontoepassing [18:55] jullie hebben namelijk al objecten gebruikt [18:56] eentje die jullie je allemaal zullen herinneren, is de list [18:56] de list is een object [18:56] ten eerste heeft het methods, we hebben nl. het volgende gedaan: [18:56] list = [1, 2, 3] [18:56] list.append(4) [18:56] append is een method, een handeling, van list [18:57] list heeft ook eigenschappen/properties, maar die kunnen we niet direct zien in dit geval. [18:58] en list is nog maar één object [18:58] Is het aantal elementen niet een property van list? [18:58] FOAD: nee, het is een enkel een property van die specifieke list [18:59] DooitzedeJong: dus bijvoorbeeld adresboek is ook een object? [18:59] het adresboek dat jullie gemaakt hebben nog niet, maar er is wel gemakkelijk een object met handelnigen van te maken [18:59] bijvoorbeeld de handeling (voeg adres toe) [19:00] hmm, laat ik nog even wat dingen toevoegen over de twee vragen: [19:00] of verwijder adres, zoek adres etc [19:00] FOAD, het aantal elementen van een lijst is eigenlijk geen property, omdat ze d.m.v. de len()-method worden verkregen. Intern gaat dat via een method, voor de geïnteresseerden. [19:01] over het adresboek, wij hebben voor het adresboek een dictionary gebruikt [19:01] en een dictionary is een object. [19:02] het is alleen geen Adresboek-object, wat, zoals Ronnie al zei, bijv. een method voeg_adres_toe zou hebben [19:02] eigenlijk is vrijwel alles in python een object, hoewel je dat niet meteen ziet. [19:03] ints, floats, strings, functies, dictionaries, lists, etc. zijn allemaal objects [19:03] 'Everything is an object' [19:03] wordt dan ook wel eens over python gezegd. [19:03] Kun je concreet een voorbeeld van een method geven? [19:03] bij een list dus 'append' [19:03] bij een string bijv. 'endswith' [19:03] en bij een dictionary bijv. 'keys' [19:04] waarom noem je len() een method? het is toch een functie. Zijn alle functies dan methods? [19:04] als ik dat inderdaad heb gedaan, is dat fout [19:04] len() is een functie [19:04] maar wat ik dacht ik zei is dat het intern een method aanroept [19:05] maar die onmerking maakt het geheel nu complexer, dus vergeet dat maar ;) [19:05] ok, ik hoor iedereen vragen om codevoorbeelden, dus ik zal jullie er een aantal geven. [19:06] ten eerste toch nog even als herhaling: http://paste.ubuntu.com/582591/ [19:07] je ziet 2 dingen: [19:07] - een object kan meerdere keren aangemaakt worden [19:07] - een object kan worden aangepast door het aanroepen van een handeling (method) [19:08] is dat duidelijk? [19:09] goed, dan het tweede voorbeeld: [19:09] http://paste.ubuntu.com/582592/ [19:09] je ziet hier een nieuwe constructie [19:09] de zogenaamde class [19:09] Wordt het eigenlijk een variabele? [19:09] in dat voorbeeld werden lists opgeslagen ín een variabele [19:09] het eerste wat jullie moeten weten is wat een class is: [19:10] het is het ontwerp/de blauwdruk van een object [19:10] zoals we ook al bij list zagen, is het mogelijk om meerdere lists aan te maken [19:10] in het tweede voorbeeld, wordt een nieuwe class gedefinieerd: [19:10] Adresboek [19:11] en daardoor wordt het mogelijk om meerdere adresboeken te maken. [19:11] voordat ik de code regel voor regel ga uitleggen, wil ik eerst even stilstaan bij hoe het mogelijk is om deze class te gebruiken: [19:11] - ten eerste is het nodig om een object te maken, net zoals in voorbeeld één. [19:12] in dat geval ging het om deze regel: [19:12] list1 = [] [19:12] in dit geval gaat dat zo: [19:12] adresboek1 = Adresboek() [19:12] overigens wordt de overeenkomst misschien duidelijker, als je weet dat je het eerste geval ook zo kan schrijven: [19:12] list1 = list() [19:13] Het lijkt een functieaanroep, maar wat het in werkelijkheid is, is het maken van een object op basis van de eisen van de class. [19:14] het is nu mogelijk om methods (handelingen) van het object adresboek1 aan te roepen: [19:14] adresboek1.voeg_toe("commandoline", "mail@adres-zeg-ik.niet") [19:15] als ik daarna mijn mailadres weer wil verwijderen, kan dat zo: [19:15] adresboek1.verwijder("commandoline") [19:16] het voordeel hiervan bovenop dat van een dictionary is klein in dit geval [19:16] hannie: horen [] en {} ook tot de eigenschappen? [19:16] maar als dit object zou moeten controleren of het adresboek geldig was, dan zou het al veel schelen. [19:17] hannie, ik kom er straks even op terug, als ik vertel wat de eigenschappen hier zijn [19:17] het voordeel van een object gebruiken is dus, dat je niet precies hoeft te weten wat er onder de motorkap gebeurt [19:18] en opnieuw ook hergebruik, net zoals bij functies [19:18] Goed, dat over het gebruik van deze class [19:18] Cugel_laptop: Is def __init__ een verplicht onderdeel van een classdefinitie? [19:18] nu even verder over hoe de class zelf is opgebouwd [19:18] nee, dat is niet perse nodig [19:19] uitleg hierover komt nog [19:19] op lijn 1 zien jullie de declaratie van de class [19:19] het lijkt wel wat op het definieren van een functie [19:19] in dit geval krijgt de class de naam 'Adresboek' [19:20] en het laatste stukje, (object), mag je voorlopig aannemen als een verplicht iets [19:20] zijn dat twee underscores? [19:20] __init__ bevat idd vier underscores [19:20] twee aan beide kanten [19:20] zodra dat is gebeurd, begint de classdefinitie [19:21] we zien daarin functies, zoals we die al eerder hebben gezien [19:21] ik begin niet met de eerste, maar met de tweede: [19:21] voeg_toe [19:21] dat is een hele normale functie, op één ding na. [19:21] het eerste argument is 'self' [19:21] en jullie hebben zonet gezien, dat we dat argument niet meegeven, we deden immers: [19:21] adresboek1 = Adresboek() [19:22] adresboek1.voeg_toe("commandoline", "mijn_mail@adres.nl") [19:22] dat eerste argument wordt gevuld door python [19:22] python geeft dan het object mee, waarop de method (de handeling) wordt aangeroepen [19:22] dus eigenlijk is het gelijk aan dit, als dat het iets duidelijker maakt: [19:23] Adresboek.voeg_toe(adresboek1, "commandoline", "mijn_mail@adres.nl") [19:23] dat geeft de method dus de mogelijkheid, om iets te veranderen aan het object zelf [19:24] in dit geval wordt de eigenschap 'adressen' verandert. [19:24] Dat is een dictionary, en er wordt een adres aan toegevoegd [19:24] verwijder doet iets soortgelijks [19:24] __init__ is nog wel bijzonder [19:24] die method wordt aangeroepen door python tijdens het maken van het object [19:24] dus, bij deze regel code: [19:24] adresboek1 = Adresboek() [19:25] wat die method doet, is niks anders dan het toevoegen van de eigenschap 'adressen' aan het object [19:25] goed, nog vragen? [19:26] dit is een ingewikkeld onderwerp, we gaan er iig de komende en waarschijnlijk ook nog de daaropvolgende les ermee verder [19:26] self, is dat een bewaarplaats waar later iets in komt? [19:26] dat argument wordt dus ingevuld door python, als je een method aanroept [19:26] het is altijd het huidige object [19:26] bijv: [19:26] adresboek1 = Adresboek() [19:27] adresboek2 = Adresboek() [19:27] adresboek1.voeg_toe("naam", "mailadres") [19:27] adresboek2.voeg_toe("naam", "mailadres") [19:27] wat er eigenlijk gebeurd bij het aanroepen van de method [19:27] is in beide gevallen anders [19:28] terwijl het hetzelfde lijkt [19:28] want achter de schermen gebeurt: [19:28] Adresboek.voeg_toe(adresboek1, "naam", "mailadres") [19:28] Adresboek.voeg_toe(adresboek2, "naam", "mailadres") [19:28] en adresboek1, 2 enz. gebruik je later in een programma? [19:28] inderdaad, het is in het adresboekprogramma dus opeens mogelijk om voor meerdere personen een adresboek te maken [19:29] zonder een regel te veranderen aan de class Adresboek [19:29] opnieuw een voordeel van classes :) [19:29] ok, het huiswerk: [19:30] maak een programma dat niks anders doet dan methods van Adresboek aanroepen [19:30] maak daarbij adresboeken aan voor meerdere personen. [19:31] probeer ook uit wat de laatste twee methods doen [19:31] probeer dus gewoon een echte situatie na te bootsen [19:31] de echte handelingen die normaal op een Adresboek losgelaten zouden worden [19:31] begrijpt iedereen dat? [19:32] ten slotte nog even een verbeterd linkje, deze class werkt nl. niet ;) [19:32] er is eigenlijk altijd wel hulp in #ubuntu-nl-mwanzo [19:33] http://paste.ubuntu.com/582607/ [19:34] probeer gewoon objects te maken van deze class dus en ze te gebruiken, dat is kortweg de opdracht [19:34] succes ermee en bedankt voor jullie komst! [19:34] Dank je wel commandoline en support! [19:34] ik ben hier nog even voor vragen [19:35] Ik vond het erg leuk om mijn oplossing te presenteren. [19:35] bedankt voor de complimenten allemaal :) [19:46] commandoline, en anderen, prettige avond nog [19:46] jij ook, hannie [19:51] let op allemaal: de les gaat volgende week niet door [19:51] i.v.m. dat ik wat anders heb [19:52] Jammer. === ChanServ changed the topic of #Ubuntu-nl-mwanzo-klas to: 22 maart 2011 19.30-20.30 workshop werken met de wiki : #Ubuntu-nl-mwanzo-klas. Info: http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/WikiInleiding Leiding: Rawchid. Logs op http://irclogs.ubuntu.com. Let ook op eventueel andere workshops. Alle cursisten join ook: #ubuntu-nl-mwanzo, daar kun je vragen stellen aan de workshopleiders. [19:56] Wat. [19:56] :( [19:56] FOAD,? [19:56] Ik wil Python. [19:57] di 22 mrt is er weer wat anders [19:57] Oh leuk, daar ga ik ook aan meedoen. [19:57] python komt waarschijnlijk een week later weer. de topics worden vrij direct bijgewerkt hier [19:58] leoquant, python kómt een week daarna weer. [19:58] juist! ツ [19:59] deo volente [20:00] Wat komt er dan volgende week. [20:01] een workshop 'Werken met de wiki' door RawChid. :) [20:02] Wat gaat RawChid ons dan vertellen [20:03] ? [20:03] http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/WikiInleiding [20:04] Dom dat ik daar niet aan dacht, ben net de wiki aan het aanpassen :P [20:42] ik ga [20:43] UndiFineD, we bespreken het nog wel even [20:43] doeg [20:43] oops verkeerde kanaal [20:43] ok