{"id":39141,"date":"2021-07-22T14:42:50","date_gmt":"2021-07-22T12:42:50","guid":{"rendered":"https:\/\/kinsta.com\/?p=97958"},"modified":"2023-06-22T10:36:42","modified_gmt":"2023-06-22T08:36:42","slug":"python-object-oriented-programming","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/","title":{"rendered":"Een beginnersgids voor Python Object-Oriented Programming (OOP)"},"content":{"rendered":"<p>Programmeren is een kunst. En net als bij kunst, is het belangrijk om de beste kwasten en verf te kiezen, om het mooiste resultaat te krijgen. Object-Oriented Programming met Python is een vaardigheid die je nodig hebt om een kunstwerk te kunnen maken.<\/p>\n<p>Het kiezen van de <a href=\"https:\/\/kinsta.com\/nl\/blog\/beste-programmeertaal-om-te-leren\/\">juiste programmeertaal<\/a> voor je project is essentieel, en kan een soepel lopend project betekent, of een absolute nachtmerrie. Daarom moet je altijd de ideale taal vinden die perfect bij je use case past.<\/p>\n<p>Dat is dan ook de voornaamste reden om object-oriented programming in Python te leren, wat overigens ook \u00e9\u00e9n van de meest populaire programmeertalen is.<\/p>\n<p>Tijd om te gaan leren dus!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Een voorbeeld van een Python programma<\/h2>\n<p>Voordat we de diepte in gaan, eerst een vraag: heb je wel eens een Python programma geschreven zoals het voorbeeld hieronder?<\/p>\n<pre><code class=\"language-python\">secret_number = 20\n \nwhile True:\n   number = input('Guess the number: ')\n \n   try:\n       number = int(number)\n   except:\n       print('Sorry that is not a number')\n       continue\n \n   if number != secret_number:\n       if number &gt; secret_number:\n           print(number, 'is greater than the secret number')\n \n       elif number &lt; secret_number:\n           print(number, 'is less than the secret number')\n   else:\n       print('You guessed the number:', secret_number)\n       break\n<\/code><\/pre>\n<p>Dit is de code van een eenvoudig programma waarmee je een getal kan raden. Kopieer het maar naar een Python bestand en voer het uit op je computer. Het zal meteen en soepel werken.<\/p>\n<p>Maar nu een probleem: wat als we je vragen om een <a href=\"https:\/\/kinsta.com\/nl\/changelog\/\">nieuwe feature<\/a> toe te voegen aan het programma? Dit kan iets simpels zijn, bijvoorbeeld:<\/p>\n<p>&#8220;Als de input een veelvoud is van het geheime getal, geef de gebruiker dan een hint.&#8221;<\/p>\n<p>Het programma zal snel veel complexer worden naarmate je het aantal features vergroot, en het aantal geneste voorwaarden zal moeilijk te beheren zijn.<\/p>\n<p>En dat is precies het probleem dat object-oriented programming op kan lossen.<\/p>\n\n<h2>Vereisten om Python OOP te leren<\/h2>\n<p>Voordat we in object-oriented programming duiken, raden we sterk aan dat je al een goede basis hebt in Python.<\/p>\n<p>Wat precies een &#8220;basis&#8221; is, is natuurlijk lastig te defini\u00ebren. Daarom hebben we een <a href=\"https:\/\/kinsta.com\/nl\/cheat-sheets\/\">cheat sheet<\/a> gemaakt met alle belangrijkste concepten die je moet kennen om aan de slag te kunnen met object-oriented programming in Python.<\/p>\n<ul>\n<li><strong>Variabele<\/strong>: Symbolische naam die naar een specifiek object verwijst (gedurende dit artikel zullen we leren wat <strong>objecten<\/strong> zijn).<\/li>\n<li><strong>Rekenkundige operators: <\/strong>Optelling (+), aftrekking (-), vermenigvuldiging(*), delen(\/), geheeltallig-delen(\/\/), modulo (%).<\/li>\n<li><strong>Ingebouwde data-types: <\/strong>Numeriek (integers, floats, complex), verzamelingen (strings, lists, tuples), Boolean (True, False), dictionaries, en sets.<\/li>\n<li><strong>Booleaanse uitdrukkingen: <\/strong>Uitdrukking waarvan het resultaat <strong>True<\/strong> of <strong>False<\/strong><\/li>\n<li><strong>Voorwaardelijk:<\/strong> Evalueert een Booleaanse uitdrukking en voert een proces uit op basis van het resultaat. Wordt geregeld via <strong>if\/else<\/strong><\/li>\n<li><strong>Loop: <\/strong>Ook wel lussen, zijn herhalende uitvoering van stukken code. Dit kunnen <strong>for<\/strong> of <strong>while<\/strong> loops zijn.<\/li>\n<li><strong>Functies: <\/strong>Blokken georganiseerde en herbruikbare code. Je kan ze via het keyword <strong>def<\/strong><\/li>\n<li><strong>Argumenten: <\/strong>Objecten die je aan een functie doorgeeft. Bijvoorbeeld: <code>sum([1, 2, 4])<\/code><\/li>\n<li><strong>Uitvoeren van een Python script<\/strong>: Open een terminal of <a href=\"https:\/\/kinsta.com\/nl\/blog\/ssh-commandos\/\">command line<\/a> en typ \u201cpython &lt;bestandsnaam&gt;.\u201d<\/li>\n<li><strong>Open een Python Shell<\/strong>: Open een terminal en typ <code>python<\/code> of <code>python3<\/code>, afhankelijk van je systeem.<\/li>\n<\/ul>\n<p>Nu je deze concepten helder hebt, kunnen we doorgaan met het leren van object-oriented programming.<\/p>\n<h2>Wat is object-oriented programming in Python?<\/h2>\n<p>Object-oriented programming (OOP) is een paradigma of methode voor programmeren waarbij we complexe problemen benaderen als objecten.<\/p>\n<p>Een methode of paradigma is een theorie die de basis biedt voor het oplossen van problemen.<\/p>\n<p>Wanneer we het dus hebben over OOP, hebben we het over een verzameling concepten en patronen waarbij we problemen oplossen via objecten.<\/p>\n<p>Een object in Python is een verzameling data (attributes) en gedrag (methods). Je kan objecten zien zoals veel tastbare dingen om je heen. Denk bijvoorbeeld aan een rekenmachine:<\/p>\n<figure id=\"attachment_97985\" aria-describedby=\"caption-attachment-97985\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Objects-around-you.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97985 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Objects-around-you.png\" alt=\"Een rekenmachine kan een object zijn.\" width=\"1024\" height=\"512\"><\/a><figcaption id=\"caption-attachment-97985\" class=\"wp-caption-text\">Een rekenmachine kan een object zijn.<\/figcaption><\/figure>\n<p>Zoals je wellicht ziet zijn de data (attributen) altijd zelfstandige naamwoorden, en het gedrag (methode) wordt altijd beschreven door werkwoorden.<\/p>\n<p>Dit onderscheid is een centraal concept voor object-oriented programming. Je kan objecten bouwen waarin je data opslaat en die bepaalde functionaliteit bevatten.<\/p>\n<h2>Waarom gebruiken we object-oriented programming in Python?<\/h2>\n<p>Met OOP kan je veilige en robuuste software bouwen. Veel <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-vs-python\/#library-support\">Python frameworks en libraries<\/a> gebruiken dit paradigma om hun codebase te bouwen. Voorbeeld zijn Django, Kivy, pandas, NumPy, en TensorFlow.<\/p>\n<p>We kijken naar de belangrijkste voordelen van het gebruik van OOP in Python.<\/p>\n<h3>Voordelen van OOP in Python<\/h3>\n<p>De volgende redenen zijn uitstekende argumenten om te kiezen voor object-oriented programming in Python.<\/p>\n<h4>Alle moderne programmeertalen gebruiken OOP<\/h4>\n<p>Dit paradigma is onafhankelijk van de programmeertaal. Als je OOP in Python leert, zul je het ook kunnen toepassen op de volgende talen:<\/p>\n<ul>\n<li>Java<\/li>\n<li>PHP (lees ook onze <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-vs-python\/\">vergelijking tussen PHP en Python<\/a>)<\/li>\n<li>Ruby<\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/javascript-bibliotheken\/\">Javascript<\/a><\/li>\n<li>C#<\/li>\n<li>Kotlin<\/li>\n<\/ul>\n<p>Al deze talen zijn van zichzelf object-oriented of bieden mogelijkheden voor object-oriented functionaliteit. Wil je na Python meer over die talen leren, dan is het dus makkelijker, omdat je veel overeenkomsten zult zien tussen verschillende programmeertalen die met objecten werken.<\/p>\n<h4>Met OOP kan je sneller programmeren<\/h4>\n<p>Sneller programmeren betekent niet altijd minder regels code schrijven. Het betekent dat je meer features in minder tijd kan implementeren, zonder de stabiliteit in gevaar brengt.<\/p>\n<p>Object-oriented programming maakt het mogelijk om code te hergebruiken door het implementeren van <a href=\"#bookmark=id.gjdgxs\">abstractie<\/a>. Dit principe maakt je code beter te lezen en bondiger.<\/p>\n<p>Zoals je wellicht weet, zijn <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ontwikkelaar-huren\/\">programmeurs<\/a> veel meer tijd kwijt aan het lezen van code dan aan het schrijven ervan. Dat is de reden dat leesbaarheid veel belangrijker is dan het zo snel mogelijk afmaken van features.<\/p>\n<figure id=\"attachment_97986\" aria-describedby=\"caption-attachment-97986\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Not-legible-code.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97986 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Not-legible-code.png\" alt=\"Productiviteit neemt af bij slecht leesbare code\" width=\"1024\" height=\"512\"><\/a><figcaption id=\"caption-attachment-97986\" class=\"wp-caption-text\">Productiviteit neemt af bij slecht leesbare code<\/figcaption><\/figure>\n<p>Je zal verderop meer lezen over het principe van abstractie.<\/p>\n<h4>OOP helpt je om spaghetti-code te voorkomen<\/h4>\n<p>Herinner je je programma om getallen te raden van de inleiding van dit artikel?<\/p>\n<p>Als je features blijft toevoegen, heb je op een gegeven moment allemaal geneste <strong>if<\/strong> statements. Deze wirwar van code noemen we spaghetti-code, en dat moet je natuurlijk voorkomen.<\/p>\n<p>OOP geeft de mogelijkheid om alle logica te <a href=\"https:\/\/kinsta.com\/nl\/blog\/gzip-compressie\/\">comprimeren<\/a> in objecten, waardoor je allerlei geneste <strong>if<\/strong> statements kan voorkomen.<\/p>\n<h4>OOP verbetert je analyse en begrip van de situatie<\/h4>\n<p>Nadat je wat meer ervaring hebt met OOP, zul je sneller problemen kunnen onderscheiden in kleine en specifieke objecten.<\/p>\n<p>Hierdoor kan je sneller aan de slag met nieuwe projecten.<\/p>\n<h3>Gestructureerd programmeren en object-oriented programming<\/h3>\n<p>Gestructureerd programmeren is het meestgebruikte paradigma voor beginners, omdat het de eenvoudigste manier is om een klein programma te bouwen.<\/p>\n<p>Hierbij voer je een Python programma in volgorde uit. Je geeft de computer dus een lijst met taken die van boven naar beneden uitgevoerd worden.<\/p>\n<p>Laten we eens kijken naar zo&#8217;n voorbeeld bij een programma voor een koffiebar.<\/p>\n<pre><code class=\"language-python\">small = 2\nregular = 5\nbig = 6\n \nuser_budget = input('What is your budget? ')\n \ntry:\n   user_budget = int(user_budget)\nexcept:\n   print('Please enter a number')\n   exit()\n \nif user_budget &gt; 0:\n   if user_budget &gt;= big:\n       print('You can afford the big coffee')\n       if user_budget == big:\n           print('It\\'s complete')\n       else:\n           print('Your change is', user_budget - big)\n   elif user_budget == regular:\n       print('You can afford the regular coffee')\n       print('It\\'s complete')\n   elif user_budget &gt;= small:\n       print('You can buy the small coffee')\n       if user_budget == small:\n           print('It\\'s complete')\n       else:\n           print('Your change is', user_budget - small)\n<\/code><\/pre>\n<p>Bovenstaande code werkt als de verkoper van een koffiebar. Je wordt gevraagd naar je budget, en wordt dan de grootst mogelijke koffie aangeboden die je kan betalen.<\/p>\n<p>Probeer het maar eens uit te voeren in de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wp-cli\/\">terminal<\/a>. Het zal stap voor stap uitgevoerd worden, op basis van je input.<\/p>\n<p>De code werkt perfect, maar er zitten drie nadelen aan:<\/p>\n<ol>\n<li>Er zit veel herhalende logica in.<\/li>\n<li>Er worden veel geneste <strong>if<\/strong> voorwaarden gebruikt.<\/li>\n<li>Het is moeilijk te lezen en te bewerken.<\/li>\n<\/ol>\n<p>OOP is bedacht als oplossing voor al deze problemen.<\/p>\n<p>Laten we eens naar bovenstaand programma kijken, maar dan met OOP. Maak je geen zorgen als je het niet meteen begrijpt. We willen vooral het verschil tussen object-oriented programming en gestructureerd programmeren laten zien.<\/p>\n<pre><code class=\"language-python\">class Coffee:\n        # Constructor\n        def __init__(self, name, price):\n                self.name = name\n                self.price = float(price)\n        def check_budget(self, budget):\n                # Check if the budget is valid\n                if not isinstance(budget, (int, float)):\n                        print('Enter float or int')\n                        exit()\n                if budget &lt; 0: \n                    print('Sorry you don\\'t have money') \n                    exit() \n        def get_change(self, budget):\n                return budget - self.price\n        \n        def sell(self, budget):\n                self.check_budget(budget)\n                if budget &gt;= self.price:\n                        print(f'You can buy the {self.name} coffee')\n                        if budget == self.price:\n                                print('It\\'s complete')\n                        else:\n                                print(f'Here is your change {self.get_change(budget)}$')\n\n                        exit('Thanks for your transaction')\n<\/code><\/pre>\n<p><strong>Opmerking<\/strong>: Alle volgende concepten worden verderop uitgelegd.<\/p>\n<p>De code hierboven definieert een <strong>class<\/strong> met de naam &#8220;Coffee&#8221;. Die class heeft twee attributen: &#8220;name&#8221; en &#8220;price&#8221;, die allebei gebruikt worden in de methoden. De primaire methode is &#8220;sell&#8221;, waarin alle logica voor het verkoopproces uitgevoerd wordt.<\/p>\n<p>Als je die class probeert uit te voeren, krijg je echter geen output. Dat komt omdat we alleen het &#8220;template&#8221; voor de koffie bepalen, en niet de soorten koffie zelf.<\/p>\n<p>Die class kunnen we implementeren met de volgende code:<\/p>\n<pre><code class=\"language-python\">small = Coffee('Small', 2)\nregular = Coffee('Regular', 5)\nbig = Coffee('Big', 6)\n \ntry:\n   user_budget = float(input('What is your budget? '))\nexcept ValueError:\n   exit('Please enter a number')\n  \nfor coffee in [big, regular, small]:\n   coffee.sell(user_budget)\n<\/code><\/pre>\n<p>In dit deel maken we <strong>instances<\/strong>, oftewel koffie-objecten, van de class &#8220;Coffee&#8221;, en gebruiken dan de &#8220;sell&#8221; methode van elke coffee, totdat de gebruiker aankomt bij een koffie die betaalbaar is.<\/p>\n<p>We krijgen met beide aanpakken dezelfde output, maar met OOP kunnen we het programma veel makkelijker uitbreiden.<\/p>\n<p>Hieronder een tabel met een vergelijking van object-oriented programming en gestructureerd programmeren:<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>OOP<\/strong><\/td>\n<td><strong>Gestructureerd programmeren<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Eenvoudiger te onderhouden<\/td>\n<td>Moeilijk te onderhouden<\/td>\n<\/tr>\n<tr>\n<td>Don\u2019t Repeat Yourself (DRY) aanpak<\/td>\n<td>Code wordt vaak herhaald<\/td>\n<\/tr>\n<tr>\n<td>Kleine stukjes code worden veel hergebruikt<\/td>\n<td>Erg veel code<\/td>\n<\/tr>\n<tr>\n<td>Object aanpak<\/td>\n<td>Blokken code<\/td>\n<\/tr>\n<tr>\n<td>Eenvoudiger te <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-debugging\/\">debuggen<\/a><\/td>\n<td>Moeilijker te debuggen<\/td>\n<\/tr>\n<tr>\n<td>Steile leercurve<\/td>\n<td>Minder steile leercurve<\/td>\n<\/tr>\n<tr>\n<td>Gebruikt in <a href=\"https:\/\/kinsta.com\/nl\/klanten\/\">grote projecten<\/a><\/td>\n<td>Geoptimaliseerd voor simpele programma&#8217;s<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Om de vergelijking samen te vatten:<\/p>\n<ul>\n<li>Geen van beide aanpakken is perfect, want OOP kan juist te veel van het goede zijn in kleinere projecten.<\/li>\n<li>Er zijn niet maar twee manieren om een probleem op te lossen, er zijn nog allerlei andere.<\/li>\n<li>OOP wordt vooral gebruikt in projecten met veel code, terwijl gestructureerd programmeren ideaal is voor simpelere projecten.<\/li>\n<\/ul>\n<p>Tijd om door te gaan naar ingebouwde objecten in Python.<\/p>\n<h2>In Python is alles een object<\/h2>\n<p>We verklappen je een geheimpje: je gebruikt al de hele tijd OOP.<\/p>\n<p>Zelfs bij andere paradigma&#8217;s in Python, zul je nog objecten gebruiken voor allerlei dingen.<\/p>\n<p>Dat komt omdat binnen Python, <em>alles<\/em> een object is.<\/p>\n<p>De definitie van een object was immers: Een object in Python is een verzameling data (attributes) en gedrag (methods).<\/p>\n<p>Dat komt overeen met elke soort data in Python.<\/p>\n<p>Een string is een verzameling data (characters) met gedrag (<strong>upper()<\/strong>, <strong>lower()<\/strong>, etc.). Hetzelfde geldt voor <strong>integers<\/strong>, <strong>floats<\/strong>, <strong>booleans<\/strong>, <strong>lists,<\/strong> en dictionaries.<\/p>\n<p>Voordat we verder gaan, kijken we nog eens naar de betekenis van attributes en methods.<\/p>\n<h3>Attributes en methods<\/h3>\n<p>Attributes zijn interne <strong>variabelen<\/strong> binnen objecten, en methods zijn <strong>functies<\/strong> die bepaald gedrag produceren.<\/p>\n<p>Een eenvoudige oefening binnen de Python shell. Je kan deze openen door <code>python<\/code> of <code>python3<\/code> in te typen in je terminal.<\/p>\n<figure id=\"attachment_97989\" aria-describedby=\"caption-attachment-97989\" style=\"width: 843px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Python-terminal.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97989 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Python-terminal.png\" alt=\"Python 3.9\u00a0 shell\" width=\"843\" height=\"123\"><\/a><figcaption id=\"caption-attachment-97989\" class=\"wp-caption-text\">Python shell<\/figcaption><\/figure>\n<p>Laten we de methods en types ontdekken met de Python <a href=\"https:\/\/kinsta.com\/nl\/blog\/ssh-vs-ssl\/\">shell<\/a><\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; kinsta = 'Kinsta, Premium Application, Database, and Managed WordPress hosting'\n&gt;&gt;&gt; kinsta.upper()\n'KINSTA, PREMIUM\u00a0APPLICATION, DATABASE, AND MANAGED WORDPRESS HOSTING'\n<\/code><\/pre>\n<p>In de tweede regel gebruiken we een string method, <strong>upper()<\/strong>. Hiermee krijg je de inhoud van een string terug in hoofdletters (uppercase). Maar de originele variabele blijft hetzelfde.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; kinsta\n'Kinsta, Premium\u00a0Application, Database, and Managed WordPress hosting'\n<\/code><\/pre>\n<p>We kijken naar de functies bij het werken met objecten.<\/p>\n<p>De functie <strong>type()<\/strong> geeft je het type van een object. Het &#8220;type&#8221; is de class waartoe een object hoort.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; type(kinsta)\n# class 'str'\n<\/code><\/pre>\n<p>De <strong>dir()<\/strong> functie geeft alle attributes en methods van een object. We testen dit bij de variabele <strong>kinsta<\/strong>.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; dir(kinsta)\n['__add__', '__class__',  ........... 'upper', 'zfill']\n<\/code><\/pre>\n<p>Nu proberen we enkele van de verborgen attributes van dit object te zien.<\/p>\n<pre><code class=\"language-python\"> &gt;&gt;&gt; kinsta.__class__ # class \u2018str\u2019 e&gt;<\/code><\/pre>\n<p>Hiermee krijg je de class van het object <strong>kinsta<\/strong> te zien. Het enige dat de functie <strong>type<\/strong> geeft is dus het <strong>__class__<\/strong> attribute van een object.<\/p>\n<p>Je kan via de terminal experimenten met de verschillende data types, om te zien welke attributes en methods erbij horen. Je kan ook meer lezen over de ingebouwde data types in de <a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html\">offici\u00eble documentatie<\/a>.<\/p>\n<h2>Je eerst object in Python<\/h2>\n<p>Een <strong>class<\/strong> is een soort template<strong>.<\/strong> Hiermee kan je custom objecten maken op basis van de attributes en methoden die je zelf definieert.<\/p>\n<p>Je kan het zien als een <strong>koekjesvorm<\/strong> waarmee je de perfecte koekjes kan bakken (dan bedoelen we natuurlijk de objecten, geen <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-cookies-php-sessiess\/\">tracking cookies<\/a>), met bepaalde eigenschappen zoals vorm en grootte.<\/p>\n<p>Aan de andere kant hebben we <strong>instances. <\/strong>Een instance is een individueel object van een class, met een uniek geheugenadres.<\/p>\n<figure id=\"attachment_97990\" aria-describedby=\"caption-attachment-97990\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Instances.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97990 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Instances.png\" alt=\"Instances in Python\" width=\"1024\" height=\"512\"><\/a><figcaption id=\"caption-attachment-97990\" class=\"wp-caption-text\">Instances in Python<\/figcaption><\/figure>\n<p>Nu je weet wat instances en classes zijn, kunnen we die eens gaan uitproberen.<\/p>\n<p>Om een class in Python te defini\u00ebren, gebruik je het <strong>class<\/strong> keyword, en vervolgens de gewenste naam. In dit geval maak je een class met de naam <strong>Cookie<\/strong>.<\/p>\n<p><strong>Opmerking:<\/strong> In Python gebruiken we de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Camel_case#:~:text=Camel%20case%20(sometimes%20stylized%20as,word%20starting%20with%20either%20case.\">camel case naamconventie<\/a> voor de namen van classes.<\/p>\n<pre><code class=\"language-python\">class Cookie:\n\tpass\n<\/code><\/pre>\n<p>Open je Python shell en typ bovenstaande code in. Om een instance van een class te maken, kan je gewoon de naam intypen, met haakjes erachter. Hetzelfde proces gebruiken we om een functie te maken.<\/p>\n<pre><code class=\"language-python\">cookie1 = Cookie()\n<\/code><\/pre>\n<p>Gefeliciteerd! Je bent nu de trotse bezitter van je eerste object in Python! Je kan het id en type bekijken met deze code:<\/p>\n<pre><code class=\"language-python\">id(cookie1)\n140130610977040 # Unique identifier of the object\n\ntype(cookie1)\n&lt;class '__main__.Cookie'&gt;\n<\/code><\/pre>\n<p>Zoals je kan zien heeft het object nu een unieke identifier in het geheugen, en is het type <strong>Cookie<\/strong>.<\/p>\n<p>Je kan ook controleren of een object een instance is van een class, met de functie <strong>isinstance()<\/strong>.<\/p>\n<pre><code class=\"language-python\">isinstance(cookie1, Cookie)\n# True\nisinstance(cookie1, int)\n# False\nisinstance('a string', Cookie)\n# False\n<\/code><\/pre>\n<h3>Constructor method<\/h3>\n<p>De <strong>__init__()<\/strong> method wordt ook wel \u201cconstructor\u201d genoemd. Het wordt elke keer gebruikt in Python wanneer een een object oproepen.<\/p>\n<p>De <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#constructor-property-promotion\">constructor<\/a> maakt de initi\u00eble staat van een object, met het minimum aan parameters. Laten we de <strong>Cookie<\/strong> class aanpassen, zodat de class parameters accepteert in de constructor.<\/p>\n<pre><code class=\"language-python\">class Cookie:\n\t# Constructor\n\tdef __init__(self, name, shape, chips='Chocolate'):\n\t\t# Instance attributes\n\t\tself.name = name\n\t\tself.shape = shape\n\t\tself.chips = chips\n<\/code><\/pre>\n<p>In de class <strong>Cookie<\/strong> moet elk cookie nu een naam(name), vorm (shape) en vulling (chips) hebben. Die laatste hebben we gedefinieerd als &#8220;Chocolate&#8221;.<\/p>\n<p>Aan de andere kant refereert <strong>self<\/strong> naar de instance van de class (het object zelf).<\/p>\n<p>Probeer de class maar eens uit in de shell, en maak een instance van een cookie aan.<\/p>\n<pre><code class=\"language-python\">cookie2 = Cookie()\n# TypeError\n<\/code><\/pre>\n<p>Je krijgt nu een foutmelding. Dat komt omdat je de minimale hoeveelheid data moet bieden voor het object, in dit geval dus de <strong>name<\/strong> en <strong>shape<\/strong>, aangezien we <strong>chips<\/strong> al standaard op &#8220;Chocolate&#8221; hebben ingesteld.<\/p>\n<pre><code class=\"language-python\">cookie2 = Cookie('Awesome cookie', 'Star')\n<\/code><\/pre>\n<p>Om de attributes van een instance te openen, moet je de puntnotatie gebruiken.<\/p>\n<pre><code class=\"language-python\">cookie2.name\n# 'Awesome cookie'\ncookie2.shape\n# 'Star'\ncookie2.chips\n# 'Chocolate'\n<\/code><\/pre>\n<p>Tot zover is de <strong>Cookie<\/strong> class nog niet heel spannend. Laten we een method <strong>bake()<\/strong> toevoegen om het wat interessanter te maken.<\/p>\n<pre><code class=\"language-python\">class Cookie:\n\t# Constructor\n\tdef __init__(self, name, shape, chips='Chocolate'):\n\t\t# Instance attributes\n\t\tself.name = name\n\t\tself.shape = shape\n\t\tself.chips = chips\n\n\t# The object is passing itself as a parameter\n\tdef bake(self):\n\t\tprint(f'This {self.name}, is being baked with the shape {self.shape} and chips of {self.chips}')\n\t\tprint('Enjoy your cookie!')\n<\/code><\/pre>\n<p>Om een method te callen gebruik je de puntnotatie, en roep je dit op als een function.<\/p>\n<pre><code class=\"language-python\">cookie3 = Cookie('Baked cookie', 'Tree')\ncookie3.bake()\n# This Baked cookie, is being baked with the shape Tree and chips of Chocolate\nEnjoy your cookie!\n<\/code><\/pre>\n<h2>De 4 pijlers van OOP in Python<\/h2>\n<p>Object-oriented programming bestaat uit vier belangrijke pijlers:<\/p>\n<h4>1. Abstractie<\/h4>\n<p>Abstractie verbergt de interne functie van een toepassing voor de gebruiker. De gebruiker kan zowel de eindgebruiker zijn als andere developers.<\/p>\n<p>We komen <strong>abstractie<\/strong> overal tegen. Zo weet je bijvoorbeeld hoe je je smartphone moet gebruiken, maar waarschijnlijk weet je niet precies wat er allemaal gebeurt wanneer je een app opent.<\/p>\n<p>Een ander voorbeeld is Python zelf. Je weet hoe je het kan gebruiken via <a href=\"https:\/\/kinsta.com\/nl\/blog\/cms-systemen\/\">functionele software<\/a>, en dat kan je ook doen als je Python&#8217;s interne werking niet precies kent.<\/p>\n<p>Door ditzelfde principe toe te passen op code, kan je alle objecten in een probleem verzamelen en de standaard functionaliteit naar classes <strong>abstraheren<\/strong>.<\/p>\n<h4>2. Overerving (inheritance)<\/h4>\n<p>Door overerving kunnen we diverse <strong>subclasses<\/strong> defini\u00ebren, van een eerder gedefinieerde class.<\/p>\n<p>Het belangrijkste doel hierbij is om het <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\">DRY principe<\/a> te volgen. Je kan een hoop code hergebruiken door de gedeelde componenten te implementeren via <strong>superclasses<\/strong>.<\/p>\n<p>Je kan dit vergelijken met het biologische principe van <strong>genetische overerving<\/strong>. <a href=\"https:\/\/kinsta.com\/nl\/blog\/child-thema-wordpress\/\">Kinderen<\/a> (subclasses) zijn het resultaat van overerving van twee ouders (superclasses). Ze erven de fysieke eigenschappen (attributes) en een deel van het gedeelde gedrag (methods).<\/p>\n<h4>3. Aanpassing (polymorphism)<\/h4>\n<p>Door aanpassing kunnen we methods en attributes van <strong>subclasses<\/strong> net wat anders maken dan in de <strong>superclass<\/strong>.<\/p>\n<p>Letterlijk betekent polymorfisme <strong>&#8220;veelvormigheid<\/strong>&#8220;. Dat is omdat we methodes bouwen met dezelfde naam maar verschillende functies.<\/p>\n<p>Om terug te gaan naar de erfelijkheid, zijn kinderen ook een goed voorbeeld van polymorfisme. Ze kunnen een bepaalde gedrag, <strong>get_hungry()<\/strong> erven, maar met een kleine aanpassing, bijvoorbeeld doordat ze elke 4 uur honger krijgen in plaats van elke 6 uur.<\/p>\n<h4>4. Inkapseling<\/h4>\n<p>Inkapseling is het proces waarbij we de interne integriteit van data binnen een class beschermen.<\/p>\n<p>Alhoewel er geen <strong>private<\/strong> statement bestaat in Python, kan je inkapseling toepassen door <a href=\"https:\/\/en.wikipedia.org\/wiki\/Name_mangling#Python\">mangling<\/a> te gebruiken in Python. Er zijn speciale methods genaamd <strong>getters<\/strong> en <strong>setters<\/strong> waarmee we unieke attributes en methods kunnen maken.<\/p>\n<p>Stel dat we een <strong>Human<\/strong> class maken met een uniek attribuut genaamd <strong>_height<\/strong>. Je kan dit attribuut alleen aanpassen binnen bepaalde beperkingen (het is menselijk nagenoeg onmogelijk om langer dan 3 meter te zijn).<\/p>\n<h2>Bouwen van een rekenmachine voor het berekenen van de oppervlakte van een vorm<\/h2>\n<p>Het mooie aan Python is dat we er allerlei software mee kunnen maken, van een <a href=\"https:\/\/kinsta.com\/nl\/docs\/devkinsta\/wp-cli\/\">Command Line Interface (CLI)<\/a> programma, tot een complexe web app.<\/p>\n<p>Nu je de belangrijkste concepten van OOP hebt geleerd, is het tijd om ze eens toe te passen op een echt project.<\/p>\n<p><strong>Opmerking<\/strong>: Alle onderstaande code is beschikbaar in dit <a href=\"https:\/\/github.com\/DaniDiazTech\/Object-Oriented-Programming-in-Python\/blob\/main\/shape_calculator\/calculator.py\">GitHub repository<\/a>. Een <a href=\"https:\/\/kinsta.com\/nl\/blog\/code-review-tools\/#3-github\">code beoordelingstool<\/a> waarmee we versies van code kunnen beheren via Git.<\/p>\n<p>Je opdracht is om een oppervlakte-rekenmachine te maken voor de volgende vormen:<\/p>\n<ul>\n<li>Vierkant<\/li>\n<li>Rechthoek<\/li>\n<li>Driehoek<\/li>\n<li>Cirkel<\/li>\n<li>Zeshoek<\/li>\n<\/ul>\n<h3>Base class Shape (vorm)<\/h3>\n<p>Eerst maak je een bestand met de naam <strong>calculator.py<\/strong>, wat je opent in Python. Aangezien we al objecten hebben om mee te werken, kunnen we ze makkelijk <strong>abstraheren<\/strong> naar een class.<\/p>\n<p>Je kan de overeenkomsten analyseren en realiseren dat het allemaal <strong>2D vormen<\/strong> zijn. Daarom kan je het beste een class <strong>Shape<\/strong> maken met een method <strong>get_area()<\/strong>, waar elke vorm van kan erven.<\/p>\n<p><strong>Opmerking:<\/strong> Alle methods moeten werkwoorden zijn, volgens de afspraken. Daarom heet de method <strong>get_area()<\/strong> en niet gewoon <strong>area()<\/strong>.<\/p>\n<pre><code class=\"language-python\">class Shape:\n\tdef __init__(self):\n\t\tpass\n\n\tdef get_area(self):\n\t\tpass\n<\/code><\/pre>\n<p>De bovenstaande code definieert de class, maar is zelf nog niet zo interessant.<\/p>\n<p>We implementeren de functionaliteit voor de meeste vormen.<\/p>\n<pre><code class=\"language-python\">class Shape:\n\tdef __init__(self, side1, side2):\n\t\tself.side1 = side1\n\t\tself.side2 = side2\n\n\tdef get_area(self):\n\t\treturn self.side1 * self.side2\n\n\tdef __str__(self):\n\t\treturn f'The area of this {self.__class__.__name__} is: {self.get_area()}'\n<\/code><\/pre>\n<p>Laten we stap voor stap langslopen wat deze code doet:<\/p>\n<ul>\n<li>In de <strong>__init__<\/strong> method, vragen we twee parameters, <strong>side1<\/strong> en <strong>side2<\/strong>. Dit blijven <strong>instance attributes<\/strong>.<\/li>\n<li>De functie <strong>get_area()<\/strong> geeft dan de oppervlakte van de vorm. In dit geval wordt de formule voor een rechthoek gebruikt, aangezien dat de makkelijkste optie is.<\/li>\n<li>De <strong>__str__()<\/strong> method is een \u201cmagic method\u201d net als <strong>__init__(). <\/strong>Hiermee kan je veranderen wat een instance print.<\/li>\n<li>Het verborgen attribute <strong>__class__.__name__ <\/strong>refereert aan de naam van de class. Als je werkt met een <strong>Triangle<\/strong> class, zou dat attribute dus &#8220;Triangle&#8221; zijn.<\/li>\n<\/ul>\n<h3>Rectangle Class<\/h3>\n<p>Aangezien we de formule voor de oppervlakte van een rechthoek gebruiken, kunnen we een eenvoudige <strong>Rectangle<\/strong> class maken die niks doet, behalve overerven van de <strong>Shape<\/strong> class.<\/p>\n<p>Om <strong>overerving<\/strong> in Python te gebruiken, maak je een class aan, met de <strong>superclass<\/strong> waarvan je wil erven in haakjes.<\/p>\n<pre><code class=\"language-python\"># Folded base class\nclass Shape: ...\n \nclass Rectangle(Shape): # Superclass in Parenthesis\n\tpass\n<\/code><\/pre>\n<h3>Square Class<\/h3>\n<p>We kunnen <strong>polymorfisme<\/strong> gebruiken met de <strong>Square<\/strong> class.<\/p>\n<p>Uiteindelijk is een vierkant gewoon een rechthoek waarbij alle vier de zijden gelijk zijn. We kunnen dus dezelfde wiskundige formule gebruiken voor de oppervlakte.<\/p>\n<p>We doen dit door de method <strong>init<\/strong> aan te passen, waarbij we een <strong>side<\/strong> als parameter aannemen, en die doorgeven aan de constructor van de <strong>Rectangle<\/strong> class.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\n \nclass Square(Rectangle):\n\tdef __init__(self, side):\n\t\tsuper().__init__(side, side)\n<\/code><\/pre>\n<p>Zoals je kan zien geeft de <a href=\"https:\/\/docs.python.org\/3\/library\/functions.html#super\">super function<\/a> de <strong>side<\/strong> parameter nu twee keer door naar de <strong>superclass<\/strong>. Anders gezegd wordt <strong>side<\/strong> nu als zowel <strong>side1<\/strong> als <strong>side2<\/strong> doorgegeven aan de constructor.<\/p>\n<h3>Triangle Class<\/h3>\n<p>Een driehoek is half zo groot als de rechthoek eromheen.<\/p>\n<figure id=\"attachment_97994\" aria-describedby=\"caption-attachment-97994\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a style=\"font-size: 1rem\" href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Triangle-formula.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97994 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Triangle-formula.png\" alt=\"De relatie tussen driehoeken en rechthoeken (Afbeelding: Varsity tutors).\" width=\"300\" height=\"200\"><\/a><figcaption id=\"caption-attachment-97994\" class=\"wp-caption-text\">De relatie tussen driehoeken en rechthoeken (Afbeelding: Varsity tutors).<\/figcaption><\/figure>\n<p>Daarom kunnen we weer erven van de <strong>Rectangle<\/strong> class en de <strong>get_area<\/strong> method gebruiken om de driehoeksformule toe te passen, wat de helft is van de basis keer de hoogte.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\n \nclass Triangle(Rectangle):\n\tdef __init__(self, base, height):\n\t\tsuper().__init__(base, height)\n \n\tdef get_area(self):\n\t\tarea = super().get_area()\n\t\treturn area \/ 2\n<\/code><\/pre>\n<p>Een andere use case van de <strong>super()<\/strong> function is om een method te roepen die je in de <strong>superclass<\/strong> gedefinieerd hebt en het resultaat als een variabele op te slaan. Dat is wat er gebeurt in de <strong>get_area()<\/strong> method.<\/p>\n<h3>Circle Class<\/h3>\n<p>Je kan de oppervlakte van een cirkel berekenen met de formule <strong>\u03c0r\u00b2<\/strong>, waar <strong>r<\/strong> de straal van een cirkel is. Dit betekent dat we <strong>get_area()<\/strong> weer moeten aanpassen voor die formule.<\/p>\n<p><strong>Opmerking:<\/strong> We kunnen de waarde van <strong>\u03c0<\/strong> bij benadering gebruiken vanuit de rekenmodule.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\n \n# At the start of the file\nfrom math import pi\n \nclass Circle(Shape):\n\tdef __init__(self, radius):\n\t\tself.radius = radius\n \n\tdef get_area(self):\n\t\treturn pi * (self.radius ** 2)\n<\/code><\/pre>\n<p>Bovenstaande code definieert de class <strong>Circle<\/strong>, met een andere constructor en de <strong>get_area<\/strong> methods.<\/p>\n<p>Alhoewel <strong>Circle<\/strong> erft van de <strong>Shape<\/strong> class, kan je elke method en attribuut naar wens opnieuw defini\u00ebren<\/p>\n<h3>Regular Hexagon Class<\/h3>\n<p>We hebben alleen de lengte van \u00e9\u00e9n kant van een gelijkmatige zeshoek nodig om de oppervlakte te berekenen. Het lijkt dus op de <strong>Square<\/strong> class, waarbij we maar \u00e9\u00e9n argument aan de constructor geven.<\/p>\n<figure id=\"attachment_97996\" aria-describedby=\"caption-attachment-97996\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Hexagon-formula.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97996 size-medium\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Hexagon-formula-300x165.png\" alt=\"Formule voor de oppervlakte van een zeshoek(Afbeelding: BYJU\u2019S)\" width=\"300\" height=\"165\"><\/a><figcaption id=\"caption-attachment-97996\" class=\"wp-caption-text\">Formule voor de oppervlakte van een zeshoek (Afbeelding: BYJU\u2019S)<\/figcaption><\/figure>\n<p>Maar de gebruikte formule is wel nogal anders, en gebruikt een wortel. Daarom heb je de functie <strong>sqrt()<\/strong> (vierkantswortel) nodig uit de rekenmodule.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\nclass Circle(Shape): \u2026\n \n# Import square root\nfrom math import sqrt\n \nclass Hexagon(Rectangle):\n\t\n\tdef get_area(self):\n\t\treturn (3 * sqrt(3) * self.side1 ** 2) \/ 2\n<\/code><\/pre>\n<h3>Testen van de classes<\/h3>\n<p>Je kan een interactieve modus activeren bij het uitvoeren van een Python bestand via een debugger. De makkelijkste manier om dit te doen is via de ingebouwde <a href=\"https:\/\/docs.python.org\/3\/library\/functions.html#breakpoint\">breakpoint<\/a> function.<\/p>\n<p><strong>Opmerking<\/strong> Deze functie is beschikbaar vanaf Python 3.7.<\/p>\n<pre><code class=\"language-python\">from math import pi, sqrt\n# Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\nclass Circle(Shape): \u2026\nclass Hexagon(Rectangle): \u2026\n \nbreakpoint()\n<\/code><\/pre>\n<p>Nu kan je het Python bestand uitvoeren en experimenteren met de gemaakte classes.<\/p>\n<pre><code class=\"language-python\">$ python calculator.py\n \n(Pdb) rec = Rectangle(1, 2)(Pdb) print(rec)\nThe area of this Rectangle is: 2\n(Pdb) sqr = Square(4)\n(Pdb) print(sqr)\nThe area of this Square is: 16\n(Pdb) tri = Triangle(2, 3)\n(Pdb) print(tri)\nThe area of this Triangle is: 3.0\n(Pdb) cir = Circle(4)\n(Pdb) print(cir)\nThe area of this Circle is: 50.26548245743669\n(Pdb) hex = Hexagon(3)\n(Pdb) print(hex)\nThe area of this Hexagon is: 23.382685902179844\n<\/code><\/pre>\n<h3>Challenge<\/h3>\n<p>Maak een class met de method <strong>run<\/strong> waarbij de gebruiker een vorm kan kiezen en de bijbehorende oppervlakte kan berekenen.<\/p>\n<p>Wanneer je de uitdaging afgerond hebt, kan je een pull request sturen via de <a href=\"https:\/\/kinsta.com\/nl\/blog\/git-vs-github\/\">GitHub repo<\/a> of je oplossing hieronder in de reacties zetten.<\/p>\n\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=vmNem6wxfSQ\"><\/kinsta-video>\n<h2>Samenvatting<\/h2>\n<p>Object-oriented programming is een paradigma waarbij we problemen oplossen door ze te zien als <strong>objects<\/strong>. Als je Python OOP begrijpt, kan je dit ook eenvoudig toepassen op programmeertalen zoals <a href=\"https:\/\/kinsta.com\/nl\/blog\/beste-programmeertaal-om-te-leren\/#java\">Java<\/a>, <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-php\/\">PHP<\/a>, Javascript, en <a href=\"https:\/\/kinsta.com\/nl\/blog\/beste-programmeertaal-om-te-leren\/#c-1\">C#<\/a>.<\/p>\n<p>In dit artikel heb je geleerd over:<\/p>\n<ul>\n<li>Het concept object-oriented in relatie tot Python<\/li>\n<li>Voordelen van object-oriented programming ten opzichte van gestructureerd programmeren<\/li>\n<li>Basis van object-oriented programming in Python<\/li>\n<li>Concept van <strong>classes<\/strong> en hoe je die in Python kan gebruiken<\/li>\n<li>De <strong>constructor<\/strong> van een class in Python<\/li>\n<li><strong>Methods<\/strong> en <strong>attributes<\/strong> in Python<\/li>\n<li>De vier pijlers van OOP<\/li>\n<li>Implementeren van<strong> abstractie<\/strong>,<strong> overerving, <\/strong>en<strong> polymorfisme<\/strong> binnen een project<\/li>\n<\/ul>\n<p>Nu is het aan jou!<\/p>\n<p>Als je deze gids leuk vond, bekijk dan onze post over <a href=\"https:\/\/kinsta.com\/nl\/blog\/python-tutorials\/\">Python tutorials<\/a>.<\/p>\n<p><em>Plaats je oplossing voor de challenge hieronder in de reacties! En kijk ook eens naar onze <\/em><a href=\"https:\/\/kinsta.com\/nl\/blog\/php-vs-python\/\"><em>vergelijking tussen Python en PHP<\/em><\/a><em>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programmeren is een kunst. En net als bij kunst, is het belangrijk om de beste kwasten en verf te kiezen, om het mooiste resultaat te krijgen. &#8230;<\/p>\n","protected":false},"author":181,"featured_media":39143,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[378,435],"topic":[870],"class_list":["post-39141","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-programming","tag-python","topic-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Een beginnersgids voor Python Object-Oriented Programming (OOP)<\/title>\n<meta name=\"description\" content=\"Leer alles over Object-Oriented Programming (OOP) in Python We zullen alles bespreken, van het algemene concept tot de echte implementatie, inclusief voorbeelden.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Een beginnersgids voor Python Object-Oriented Programming (OOP)\" \/>\n<meta property=\"og:description\" content=\"Leer alles over Object-Oriented Programming (OOP) in Python We zullen alles bespreken, van het algemene concept tot de echte implementatie, inclusief voorbeelden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-22T12:42:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-22T08:36:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Daniel Diaz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Leer alles over Object-Oriented Programming (OOP) in Python We zullen alles bespreken, van het algemene concept tot de echte implementatie, inclusief voorbeelden.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg\" \/>\n<meta name=\"twitter:creator\" content=\"@DaniDiazTech\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Diaz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/\"},\"author\":{\"name\":\"Daniel Diaz\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2\"},\"headline\":\"Een beginnersgids voor Python Object-Oriented Programming (OOP)\",\"datePublished\":\"2021-07-22T12:42:50+00:00\",\"dateModified\":\"2023-06-22T08:36:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/\"},\"wordCount\":3548,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg\",\"keywords\":[\"programming\",\"Python\"],\"articleSection\":[\"Webdevelopment\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/\",\"name\":\"Een beginnersgids voor Python Object-Oriented Programming (OOP)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg\",\"datePublished\":\"2021-07-22T12:42:50+00:00\",\"dateModified\":\"2023-06-22T08:36:42+00:00\",\"description\":\"Leer alles over Object-Oriented Programming (OOP) in Python We zullen alles bespreken, van het algemene concept tot de echte implementatie, inclusief voorbeelden.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg\",\"width\":1460,\"height\":730,\"caption\":\"Een beginnersgids voor Python Object-Oriented Programming (OOP)\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Een beginnersgids voor Python Object-Oriented Programming (OOP)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2\",\"name\":\"Daniel Diaz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g\",\"caption\":\"Daniel Diaz\"},\"description\":\"Daniel is a self-taught Python Developer, Technical Writer, and long-life learner. He enjoys creating software from scratch and explaining this process through stunning articles. Follow him on Twitter: @DaniDiazTech\",\"sameAs\":[\"https:\/\/developerroad.herokuapp.com\/\",\"https:\/\/www.linkedin.com\/in\/danidiaztech\",\"https:\/\/x.com\/DaniDiazTech\"],\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/danidiaztech\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Een beginnersgids voor Python Object-Oriented Programming (OOP)","description":"Leer alles over Object-Oriented Programming (OOP) in Python We zullen alles bespreken, van het algemene concept tot de echte implementatie, inclusief voorbeelden.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/","og_locale":"nl_NL","og_type":"article","og_title":"Een beginnersgids voor Python Object-Oriented Programming (OOP)","og_description":"Leer alles over Object-Oriented Programming (OOP) in Python We zullen alles bespreken, van het algemene concept tot de echte implementatie, inclusief voorbeelden.","og_url":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2021-07-22T12:42:50+00:00","article_modified_time":"2023-06-22T08:36:42+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg","type":"image\/jpeg"}],"author":"Daniel Diaz","twitter_card":"summary_large_image","twitter_description":"Leer alles over Object-Oriented Programming (OOP) in Python We zullen alles bespreken, van het algemene concept tot de echte implementatie, inclusief voorbeelden.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg","twitter_creator":"@DaniDiazTech","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Daniel Diaz","Geschatte leestijd":"20 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/"},"author":{"name":"Daniel Diaz","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2"},"headline":"Een beginnersgids voor Python Object-Oriented Programming (OOP)","datePublished":"2021-07-22T12:42:50+00:00","dateModified":"2023-06-22T08:36:42+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/"},"wordCount":3548,"commentCount":1,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg","keywords":["programming","Python"],"articleSection":["Webdevelopment"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/","url":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/","name":"Een beginnersgids voor Python Object-Oriented Programming (OOP)","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg","datePublished":"2021-07-22T12:42:50+00:00","dateModified":"2023-06-22T08:36:42+00:00","description":"Leer alles over Object-Oriented Programming (OOP) in Python We zullen alles bespreken, van het algemene concept tot de echte implementatie, inclusief voorbeelden.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2021\/07\/python-object-oriented-programming.jpeg","width":1460,"height":730,"caption":"Een beginnersgids voor Python Object-Oriented Programming (OOP)"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/python-object-oriented-programming\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/python\/"},{"@type":"ListItem","position":3,"name":"Een beginnersgids voor Python Object-Oriented Programming (OOP)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2","name":"Daniel Diaz","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g","caption":"Daniel Diaz"},"description":"Daniel is a self-taught Python Developer, Technical Writer, and long-life learner. He enjoys creating software from scratch and explaining this process through stunning articles. Follow him on Twitter: @DaniDiazTech","sameAs":["https:\/\/developerroad.herokuapp.com\/","https:\/\/www.linkedin.com\/in\/danidiaztech","https:\/\/x.com\/DaniDiazTech"],"url":"https:\/\/kinsta.com\/nl\/blog\/author\/danidiaztech\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/39141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/181"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=39141"}],"version-history":[{"count":9,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/39141\/revisions"}],"predecessor-version":[{"id":52815,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/39141\/revisions\/52815"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/translations\/pt"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/translations\/nl"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/translations\/de"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/translations\/se"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/39141\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/39143"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=39141"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=39141"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=39141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}