Skip to content

Pythonkunde

Bart Snijder edited this page May 8, 2025 · 13 revisions

Al programmerende leer je meer van de mogelijkheden van een taal, of anders gezegd gaandeweg het programmeren zie je in dat je van een facet van de taal geen bal snapt. Dan zoek je dat uit. Deze pagina is een verzameling van die zoektocht, om te voorkomen dat hetgeen geleerd is weer zo makkelijk vervliegt.

Python's datamodel

Zie ref.

  • Alles is een object
  • Elk object heeft een identiteit, een type en (een) waarde.
  • De identiteit van een object verandert nooit: dus aanpassen van een object na creatie is onmogelijk!
  • De is() operator vergelijkt de identiteit van twee objecten met elkaar.
  • De id() functie geeft de identiteit van een object in een integer waarde weer, wat ultimo overeenkomt met het geheugenadres van het object.
  • Het type van een object bepaalt welke operaties het object ondersteunt. De type() functie retourneert een object type, wat zelf ook een object is. Het type van object verandert nooit.

En nu iets geadvanceerders

Voor de ontwikkeling van Labcontrol bleek gaandeweg dat ik te weinig Python kennis had: je denkt dat je de functionaliteit op de juiste wijze hebt gecodeerd, weigert de boel! Voorbeeld is het geklier met de @property decorator i.c.m. overerving. Het geheel werkte niet lekker, dus heb ik alle decorators weer uit de code gehaald. Vervolgens ben je weer een poosje aan het klooien met een implementatie van een andere feature. Oorzaak is telkens hetzelfde: te weinig kennis van Pythons binnenkant i.c.m. de hoop dat ik met bestaande (C++/C#/Java) kennis er wel uitkom. Niet dus en vaak is dat de levenscyclus van een object binnen Python en met name de start ervan. Hier wordt het proces van het aanmaken van een object uitgelegd. Standaard dingen zijn niet moeilijk, maar als je dat nu net niet wilt, staat hier uitgelegd hoe e.e.a in elkaar steekt. Er zijn twee methoden/functies belangrijk in het creatietraject: new en init.

Uit de link kun je het volgende halen:

  • new: hoef je niet te implementeren, maar als je iets als een factory-achtig patroon wil moet je dat in/via de new functie regelen. Reden: new retourneert doorgaans een instantie van cls (een object dus). Indien er een new methode wordt geïmplementeerd waarbij deze new methode een instantie cls teruggeeft, wordt (verderop) in het proces de init functie (alleen van de geretourneerde instantie, of ook van de baseclass?) automatisch aangeroepen. Wordt er niets retourneert, dan wordt init niet opgestart. Zeer waarschijnlijk moet je dat dan zelf ergens regelen.
  • init: wordt na creatie uitgevoerd. Het object bestaat dan al. Daarom retourneert de init methode nooit iets (of hooguit None)

combinatie van het gegeven dat binnen Python de identiteit van een object niet kan veranderen, betekent dus dat je een factory patroon in de new method moet zien te verwerken, omdat dan het object nog niet (helemaal) gecreëerd is.

Clone this wiki locally