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