{"id":19067,"date":"2020-12-08T07:54:47","date_gmt":"2020-12-08T07:54:47","guid":{"rendered":"https:\/\/pythoncursus.nl\/?p=19067"},"modified":"2023-05-03T11:38:25","modified_gmt":"2023-05-03T11:38:25","slug":"decorators-python","status":"publish","type":"post","link":"https:\/\/datasciencepartners.nl\/decorators-python\/","title":{"rendered":"Decorators in Python: uitleg &#038; voorbeelden [TUTORIAL]"},"content":{"rendered":"<div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\t<p>Met <strong>decorators<\/strong> kun je <strong><a href=\"https:\/\/datasciencepartners.nl\/python-function\/\">functies<\/a><\/strong> door andere functies uit laten voeren. Dit is bijvoorbeeld handig als je de uitvoertijd van verschillende functies wilt meten. Het gebruik van decorators oogt op het eerste gezicht redelijk complex. In deze tutorial geven we een eenvoudige uitleg en laten we stap voor stap zien hoe je decorators toepast.<\/p>\n<p>Aan het eind ben je in staat decorators te gebruiken en kun je zelf een timer toevoegen in je code.<\/p>\n<h2><strong>Functies en functies in functies<\/strong><\/h2>\n<p><a href=\"https:\/\/datasciencepartners.nl\/wat-is-python\/\"><strong>Python<\/strong><\/a> is een <strong><a href=\"https:\/\/datasciencepartners.nl\/object-oriented-programming-python\/\">object geori\u00ebnteerde programmeertaal<\/a><\/strong>. Hierdoor bestaat vrijwel alles uit objecten. Zo is ook een functie een object. Functies kunnen argumenten hebben. Onderstaande functie heeft \u00e9\u00e9n argument: 'arg'.<\/p>\n<p>Deze tutorial kun je meedoen als je <a href=\"https:\/\/datasciencepartners.nl\/python-installeren\/\"><strong>Python installeert<\/strong><\/a>. Er hoeven geen speciale <a href=\"https:\/\/datasciencepartners.nl\/python-package\/\"><strong>packages<\/strong><\/a> ge\u00efnstalleerd te worden. We werken in <strong><a href=\"https:\/\/datasciencepartners.nl\/jupyter-notebook\/\">Jupyter Notebook<\/a><\/strong> gedurende deze tutorial, maar je kunt ook een andere applicatie kiezen.<\/p>\n\n\nIn\u00a0[1]:\n\n\n\n\ndef function(arg):<br \/>    print(arg)<br \/>\n\n\n\n\n\n<p>Doordat alles in Python uit objecten bestaat kan een argument in een functie zelf ook weer een functie zijn. Hierdoor kan binnen een functie een andere functie uitgevoerd worden. Dit kun je zien in het volgende voorbeeld. Hier maken we een functie met erbinnen een andere functie.<\/p>\n<p>De buitenste functie heeft \u00e9\u00e9n argument: 'message'. De binnenste functie print de inhoudt van argument 'message'. Vervolgens geeft de buitenste functie de binnenste functie terug. Dit maakt mogelijk dat we het resultaat kunnen bewaren in een variabele. Regel 'hello_func = outer_function('Hey')' bewaart alles wat in de binnenste functie uitgevoerd wordt, met argument 'Hey', in variabele 'hello_func'. Hierdoor is 'hello_func' nu als functie aan te roepen, en krijgen we het resultaat te zien.<\/p>\n\n\nIn\u00a0[2]:\n\n\n\n\ndef outer_function(message):<br \/>    def inner_function():<br \/>        print(message)<br \/>    return inner_function<br \/><br \/>hello_func = outer_function('Hey')<br \/><br \/>hello_func()<br \/>\n\n\n\n\n\n\n\n\n\n\nHey<br \/>\n\n\n\n\n\n<p>Functies gebruiken op deze manier kan vreemd lijken. Het geeft echter handige mogelijkheden. Je kunt de binnenste functie aanpassen. De binnenste functie doet iets met het argument uit de buitenste functie. Hier kun je zowel voor als na code aan toevoegen. In het volgende voorbeeld wordt er een tekst voor en na geprint.<\/p>\n\n\nIn\u00a0[3]:\n\n\n\n\ndef outer_function(message):<br \/>    def inner_function():<br \/>        print('Inner function start')<br \/>        print(message)<br \/>        print('Inner function stop')<br \/>    return inner_function<br \/><br \/>hello_func = outer_function('Hey')<br \/><br \/>hello_func()<br \/>\n\n\n\n\n\n\n\n\n\n\nInner function start<br \/>Hey<br \/>Inner function stop<br \/>\n\n\n\n\n\n\nWil jij leren hoe je Python inzet voor data analyses? Schrijf je in voor een van onze Python &amp; data science trainingen.<br \/><a href=\"https:\/\/datasciencepartners.nl\/python-cursus\/\"><button>Python cursus voor data science<\/button><\/a><br \/><a href=\"https:\/\/datasciencepartners.nl\/python-machine-learning-training\/\"><button>Python machine learning training<\/button><\/a><br \/><a href=\"https:\/\/datasciencepartners.nl\/data-science-opleiding\/\"><button>Data Science opleiding (4 dagen)<\/button><\/a><br \/><a href=\"https:\/\/datasciencepartners.nl\/data-science-bootcamp\/\"><button>Data Science bootcamp (10 dagen)<\/button><\/a>\n\n<h2><strong>Decorators gebruiken<\/strong><\/h2>\n<p>Een functie kan een andere functie als argument krijgen. Dit zien we in het volgende voorbeeld. In de buitenste functie verwachten we nu een argument 'function'. De binnenste functie print eerst een stuk tekst. Vervolgens voert de binnenste functie de functie 'function' uit. Tot slot print de binnenste functie weer een stuk tekst.<\/p>\n<p>We maken een nieuwe functie: 'say_hello()'. Deze functie print het woord 'Hey'. Als we nu de buitenste functie uitvoeren met als argument de nieuwe functie 'say_hello', gebeurt het volgende:<\/p>\n<ul> \t\n<li>Functie 'outer_function' wordt uitgevoerd met als argument functie 'say_hello'<\/li>\n\n<li>'outer_function' geeft 'inner_function' terug<\/li>\n\n<li>'inner_function' print tekst 'Inner function start'<\/li>\n\n<li>'inner_function' voert functie 'say_hello' uit, tekst 'Hey' wordt geprint<\/li>\n\n<li>'inner_function' print tekst 'Inner function stop'<\/li>\n<\/ul>\n\n\n\nIn\u00a0[4]:\n\n\n\n\ndef outer_function(function):<br \/>    def inner_function():<br \/>        print('Inner function start')<br \/>        result = function()<br \/>        print('Inner function stop')<br \/>        return result<br \/>    return inner_function<br \/><br \/>def say_hello():<br \/>    print('Hey')<br \/><br \/>hello_func = outer_function(say_hello)<br \/><br \/>hello_func()<br \/>\n\n\n\n\n\n\n\n\n\n\nInner function start<br \/>Hey<br \/>Inner function stop<br \/>\n\n\n\n\n\n<p>We hebben nu gezien dat we hiermee voor en na het uitvoeren van een functie logica uit kunnen voeren. Denk hier bijvoorbeeld aan dat je zo kunt timen wanneer een functie start en stopt. Dit kan handig zijn voor <strong><a href=\"https:\/\/datasciencepartners.nl\/data-science\/\">data science<\/a><\/strong> vraagstukken waar <a href=\"https:\/\/datasciencepartners.nl\/wat-is-een-data-scientist\/\"><strong>data scientists<\/strong><\/a> met veel data werken.<\/p>\n<p>De regel kan 'hello_func = outer_function(say_hello)' kan vervangen worden door een <strong>decorator<\/strong>. Een decorator begint altijd met een @ teken. Vervolgens benoem je de naam van de functie die je wilt gebruiken. Onderstaand toont hetzelfde resultaat als het vorige voorbeeld. We maken nu alleen gebruik van decorator '@outer_function'.<\/p>\n\n\nIn\u00a0[5]:\n\n\n\n\ndef outer_function(function):   <br \/>    def inner_function():<br \/>        print('Inner function start')<br \/>        result = function()<br \/>        print('Inner function stop')<br \/>        return result<br \/>    return inner_function<br \/><br \/>@outer_function<br \/>def say_hello():<br \/>    print('Hello')<br \/><br \/>say_hello()<br \/>\n\n\n\n\n\n\n\n\n\n\nInner function start<br \/>Hello<br \/>Inner function stop<br \/>\n\n\n\n\n\n<p>Omdat je meerder functies als decorators kunt gebruiken moeten ze een specifieke naam hebben. De binnenste functie wordt vaak 'wrapper' genoemd. Je kunt hier trouwens iedere naam voor kiezen.<br \/><!-- This site is converting visitors into subscribers and customers with OptinMonster - https:\/\/optinmonster.com :: Campaign Title: Cheatsheet inline -->\n<div id=\"om-xzn5asfsy4ouhuahjqhr-holder\"><\/div>\n<script>(function(d,u,ac){var s=d.createElement('script');s.type='text\/javascript';s.src='https:\/\/a.omappapi.com\/app\/js\/api.min.js';s.async=true;s.dataset.user=u;s.dataset.campaign=ac;d.getElementsByTagName('head')[0].appendChild(s);})(document,77079,'xzn5asfsy4ouhuahjqhr');<\/script>\n<!-- \/ OptinMonster --><\/p>\n<p>In onderstaand voorbeeld maken we een timer. We noemen de buitenste functie 'timer'. De binnenste noemen we 'wrapper'. Deze functie bewaart de starttijd. Vervolgens wordt de specifieke functie uitgevoerd. Hierna wordt de eindtijd bepaald. Tot slot wordt de naam van de specifieke functie geprint, samen met de uitvoertijd. We maken hier op 2 plaatsen gebruik van '*args, **kwargs'. Dit staat voor arguments en key word arguments. Door dit toe te voegen kan de wrapper omgaan met meerdere argumenten. Wanneer je dit niet toe zou voegen krijg je een error. Probeer maar eens.<\/p>\n<p>We maken van deze timer gebruik met functie 'say_hello'. Deze functie wacht eerst een seconde. Vervolgens wordt een bericht geprint.<\/p>\n\n\nIn\u00a0[6]:\n\n\n\n\nimport time<br \/><br \/>def timer(func):   <br \/>    def wrapper(*args, **kwargs):<br \/>        start_time = time.time()<br \/>        result = func(*args, **kwargs)<br \/>        end_time = time.time()<br \/>        print(f'Timer: function {func.__name__} completed in {round(end_time - start_time, 1)} sec.')<br \/>        return result<br \/>    return wrapper<br \/><br \/>@timer<br \/>def say_hello(msg):<br \/>    time.sleep(1)<br \/>    print(msg)<br \/>    <br \/>say_hello('Hi')<br \/>\n\n\n\n\n\n\n\n\n\n\nHi<br \/>Timer: function say_hello completed in 1.0 sec.<br \/>\n\n\n\n\n\n<p>Met 'say_hello('Hi')' wordt dus gebruik gemaakt van de timer. Hierdoor zien we dat het bericht wordt geprint. Ook wordt de uitvoertijd geprint. Hier kun je al zien dat dit handig is. De timer is nu herbruikbaar. Dit zien we ook in het volgende voorbeeld. In dit voorbeeld voegen we een nieuwe functie toe: 'say_full_name()'. Op beide functies passen we de decorator timer toe.<\/p>\n\n\nIn\u00a0[7]:\n\n\n\n\nimport time<br \/><br \/>def timer(func):   <br \/>    def wrapper(*args, **kwargs):<br \/>        start_time = time.time()<br \/>        result = func(*args, **kwargs)<br \/>        end_time = time.time()<br \/>        print(f'Timer: function {func.__name__} completed in {round(end_time - start_time, 1)} sec.')<br \/>        return result<br \/>    return wrapper<br \/><br \/>@timer<br \/>def say_hello(msg):<br \/>    time.sleep(1)<br \/>    print(msg)<br \/>    <br \/>@timer<br \/>def say_full_name(first_name, last_name):<br \/>    print(f'{first_name} {last_name}')<br \/><br \/>say_hello('Hi')<br \/>say_full_name('John', 'Parker')<br \/>\n\n\n\n\n\n\n\n\n\n\nHi<br \/>Timer: function say_hello completed in 1.0 sec.<br \/>John Parker<br \/>Timer: function say_full_name completed in 0.0 sec.<br \/>\n\n\n\n\n\n<p>We zien nu dat de timer voor beide functies te gebruiken is. Je ziet ook dat de nieuwe functie 2 argumenten heeft. De functie 'say_hello()' heeft slechts 1 argument. Doordat we gebruik maken van '*args, **kwargs' maakt dit niet uit.<\/p>\n<h2><strong>Toepassen van meerdere decorators<\/strong><\/h2>\n<p>Je hebt nu gezien hoe je gebruik maakt van een decorator. Nu kan het ook zijn dat je meerdere decorators tegelijk toe wilt passen. We gaan kijken hoe dit kan. In onderstaand voorbeeld voegen we een nieuwe functie toe: 'logger()'. Het doel van deze functie is het printen van tekst voor en nadat de functie wordt uitgevoerd. Ook printen we de eventuele arguments en key word arguments.<\/p>\n<p>Zowel de logger als timer passen we toe op de eerder gemaakt functies.<\/p>\n\n\nIn\u00a0[8]:\n\n\n\n\nimport time<br \/><br \/>def logger(func):   <br \/>    def wrapper(*args, **kwargs):<br \/>        print(f'Logger: starts for function {func.__name__}')<br \/>        result = func(*args, **kwargs)<br \/>        print(f'Logger: function {func.__name__} ran with args: {args}, and kwargs: {kwargs}.')<br \/>        return result<br \/>    return wrapper<br \/><br \/><br \/>def timer(func):   <br \/>    def wrapper(*args, **kwargs):<br \/>        start_time = time.time()<br \/>        result = func(*args, **kwargs)<br \/>        end_time = time.time()<br \/>        print(f'Timer: function {func.__name__} completed in {round(end_time - start_time, 1)} sec.')<br \/>        return result<br \/>    return wrapper<br \/><br \/>@logger<br \/>@timer<br \/>def say_hello(msg):<br \/>    time.sleep(1)<br \/>    print(msg)<br \/><br \/>@logger    <br \/>@timer<br \/>def say_full_name(first_name, last_name):<br \/>    print(f'{first_name} {last_name}')<br \/><br \/>say_hello('Hi')<br \/>say_full_name('John', 'Parker')<br \/>\n\n\n\n\n\n\n\n\n\n\nLogger: starts for function wrapper<br \/>Hi<br \/>Timer: function say_hello completed in 1.0 sec.<br \/>Logger: function wrapper ran with args: ('Hi',), and kwargs: {}.<br \/>Logger: starts for function wrapper<br \/>John Parker<br \/>Timer: function say_full_name completed in 0.0 sec.<br \/>Logger: function wrapper ran with args: ('John', 'Parker'), and kwargs: {}.<br \/>\n\n\n\n\n\n<p>We krijgen geen errors. Het <a href=\"https:\/\/datasciencepartners.nl\/python-script\/\"><strong>Python script<\/strong><\/a> kan dus uitgevoerd worden. Alleen als we goed naar het resultaat kijken zien we het volgende. De naam van de functie die de timer uitvoert is 'wrapper'. Dit is niet netjes. Hier zouden we de naam van de werkelijk uit te voeren functie willen zien.<\/p>\n<p>Dit is gemakkelijk te veranderen. Hiervoor moet je het volgende importeren: 'from functools import wraps'. Hierna zet je '@wraps(func)' voor de binnenste functies. Hierin is 'func' de naam van de uit te voeren functie. We passen dit toe in onderstaand voorbeeld.<\/p>\n\n\nIn\u00a0[9]:\n\n\n\n\nimport time<br \/>from functools import wraps<br \/><br \/>def logger(func):<br \/>    @wraps(func)<br \/>    def wrapper(*args, **kwargs):<br \/>        print(f'Logger: starts for function {func.__name__}')<br \/>        result = func(*args, **kwargs)<br \/>        print(f'Logger: function {func.__name__} ran with args: {args}, and kwargs: {kwargs}.')<br \/>        return result<br \/>    return wrapper<br \/><br \/><br \/>def timer(func):<br \/>    @wraps(func)<br \/>    def wrapper(*args, **kwargs):<br \/>        start_time = time.time()<br \/>        result = func(*args, **kwargs)<br \/>        end_time = time.time()<br \/>        print(f'Timer: function {func.__name__} completed in {round(end_time - start_time, 1)} sec.')<br \/>        return result<br \/>    return wrapper<br \/><br \/>@logger<br \/>@timer<br \/>def say_hello(msg):<br \/>    time.sleep(1)<br \/>    print(msg)<br \/><br \/>@logger    <br \/>@timer<br \/>def say_full_name(first_name, last_name):<br \/>    print(f'{first_name} {last_name}')<br \/><br \/>say_hello('Hi')<br \/>say_full_name('John', 'Parker')<br \/>\n\n\n\n\n\n\n\n\n\n\nLogger: starts for function say_hello<br \/>Hi<br \/>Timer: function say_hello completed in 1.0 sec.<br \/>Logger: function say_hello ran with args: ('Hi',), and kwargs: {}.<br \/>Logger: starts for function say_full_name<br \/>John Parker<br \/>Timer: function say_full_name completed in 0.0 sec.<br \/>Logger: function say_full_name ran with args: ('John', 'Parker'), and kwargs: {}.<br \/>\n\n\n\n\n\n<p>Wanneer je nu naar het resultaat kijkt zie je dat overal de juiste functienamen getoond worden.<\/p>\n<h2><strong>Wat je moet onthouden<\/strong><\/h2>\n<p>Met decorators kun je functies gemakkelijk door andere functies uit laten voeren. Je werkt hierbij met een buitenste- en binnenste functie. De binnenste functie wordt vaak 'wrapper' genoemd. Het geeft je de mogelijkheid om code voor en na een functie uit te voeren. Dit op een manier die je kunt hergebruiken. Dat komt omdat je met functies werkt. Een decorator plaats ja altijd voor een functie. Je gebruikt het @ teken, gevolgd door de functienaam.<\/p>\n<p>Veelgebruikte voorbeelden van decorators zijn timers en loggers. Hier hebben we decorators toegepast op functies. Het is vergelijkbaar toe te passen binnen classes.<\/p>\n<p><strong>Wil je nog veel meer leren over Python en de mogelijkheden voor data analyse? Schrijf je dan in voor onze <a href=\"https:\/\/datasciencepartners.nl\/python-cursus\/\">Python cursus<\/a> voor data science, onze <a href=\"https:\/\/datasciencepartners.nl\/python-machine-learning-training\/\">machine learning training<\/a>, of voor onze <a href=\"https:\/\/datasciencepartners.nl\/data-science-opleiding\/\">data science opleiding<\/a> en leer met vertrouwen te programmeren en analyseren in Python. Nadat je een van onze trainingen hebt gevolgd kun je zelfstandig verder aan de slag. Je kunt ook altijd even contact opnemen als je een vraag hebt.<\/strong><\/p>\n<p><strong><a href=\"https:\/\/datasciencepartners.nl\/opleidingsbrochures\/\">Download \u00e9\u00e9n van onze opleidingsbrochures voor meer informatie<\/a><\/strong><\/p>\n<p><a href=\"https:\/\/datasciencepartners.nl\/opleidingsbrochures\/\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2020\/07\/opleidingsbrochures-data-science-en-python-trainingen.png\" alt=\"\" width=\"410\" height=\"336\" \/><\/a><\/p>\n\n<p>&nbsp;<\/p>\n\n<\/div><!-- .vgblk-rw-wrapper -->","protected":false},"excerpt":{"rendered":"<p>Met decorators kun je functies door andere functies uit laten voeren. Dit is bijvoorbeeld handig als je de uitvoertijd van verschillende functies wilt meten. Het gebruik van decorators oogt op het eerste gezicht redelijk complex. In deze tutorial geven we een eenvoudige uitleg en laten we stap voor stap zien hoe je decorators toepast. Aan&#8230;<\/p>\n","protected":false},"author":5,"featured_media":19068,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"footnotes":""},"categories":[110,112],"tags":[],"class_list":["post-19067","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.7 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Decorators in Python: uitleg &amp; voorbeelden [TUTORIAL]<\/title>\n<meta name=\"description\" content=\"Decorators in Python zijn handig voor wie met functies in functies te maken heeft. Hier geven we simpele uitleg in een voorbeeld tutorial.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/datasciencepartners.nl\/decorators-python\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Decorators in Python: uitleg &amp; voorbeelden [TUTORIAL]\" \/>\n<meta property=\"og:description\" content=\"Decorators in Python zijn handig voor wie met functies in functies te maken heeft. Hier geven we simpele uitleg in een voorbeeld tutorial.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/datasciencepartners.nl\/decorators-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Data Science Partners | Trainingen Data Science in Python, SQL &amp; R\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Data-Science-Partners-102566501086560\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-08T07:54:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-03T11:38:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2020\/12\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1500\" \/>\n\t<meta property=\"og:image:height\" content=\"737\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Peter Tieleman\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Peter Tieleman\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/\"},\"author\":{\"name\":\"Peter Tieleman\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#\\\/schema\\\/person\\\/2446edb5fdc88e86d93d270c736a8803\"},\"headline\":\"Decorators in Python: uitleg &#038; voorbeelden [TUTORIAL]\",\"datePublished\":\"2020-12-08T07:54:47+00:00\",\"dateModified\":\"2023-05-03T11:38:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/\"},\"wordCount\":1820,\"publisher\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/datasciencepartners.nl\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg\",\"articleSection\":[\"Python\",\"Tutorial\"],\"inLanguage\":\"nl-NL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/\",\"url\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/\",\"name\":\"Decorators in Python: uitleg & voorbeelden [TUTORIAL]\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/datasciencepartners.nl\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg\",\"datePublished\":\"2020-12-08T07:54:47+00:00\",\"dateModified\":\"2023-05-03T11:38:25+00:00\",\"description\":\"Decorators in Python zijn handig voor wie met functies in functies te maken heeft. Hier geven we simpele uitleg in een voorbeeld tutorial.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/#primaryimage\",\"url\":\"https:\\\/\\\/datasciencepartners.nl\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg\",\"contentUrl\":\"https:\\\/\\\/datasciencepartners.nl\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg\",\"width\":1500,\"height\":737,\"caption\":\"decorators python uitleg met tutorial en voorbeelden\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/decorators-python\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/datasciencepartners.nl\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Decorators in Python: uitleg &#038; voorbeelden [TUTORIAL]\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#website\",\"url\":\"https:\\\/\\\/datasciencepartners.nl\\\/\",\"name\":\"Data Science Partners | Trainingen Data Science & AI in Python, SQL & R\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/datasciencepartners.nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#organization\",\"name\":\"Data Science Partners\",\"url\":\"https:\\\/\\\/datasciencepartners.nl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/datasciencepartners.nl\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/data-science-partners.png\",\"contentUrl\":\"https:\\\/\\\/datasciencepartners.nl\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/data-science-partners.png\",\"width\":655,\"height\":329,\"caption\":\"Data Science Partners\"},\"image\":{\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Data-Science-Partners-102566501086560\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/23709861\\\/\"],\"description\":\"Data Science Partners helpt organisaties met Data Science & AI. We werken voornamelijk met Python, SQL & R. We geven trainingen en doen consultancy opdrachten.\",\"email\":\"info@datasciencepartners.nl\",\"telephone\":\"0202443146\",\"legalName\":\"Data Science Partners B.V.\",\"foundingDate\":\"2019-10-01\",\"vatID\":\"NL863566261B01\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"11\",\"maxValue\":\"50\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/datasciencepartners.nl\\\/#\\\/schema\\\/person\\\/2446edb5fdc88e86d93d270c736a8803\",\"name\":\"Peter Tieleman\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bb4d292d1a92cd51cab3aa9697a6ed2fd45c819952fb923a01231e1282f5a0df?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bb4d292d1a92cd51cab3aa9697a6ed2fd45c819952fb923a01231e1282f5a0df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bb4d292d1a92cd51cab3aa9697a6ed2fd45c819952fb923a01231e1282f5a0df?s=96&d=mm&r=g\",\"caption\":\"Peter Tieleman\"},\"description\":\"Peter is een ervaren data scientist, AI engineer en python trainer. Na zijn studie aan de Technische Universiteit Delft heeft hij zich altijd bezig gehouden met data en diverse programmeertalen. Peter heeft veel data analyses uitgevoerd en processen geautomatiseerd met Python in productieomgevingen.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/petertieleman\\\/\"],\"honorificPrefix\":\"Heer\",\"honorificSuffix\":\"Ir.\",\"birthDate\":\"1988-05-26\",\"gender\":\"mannelijk\",\"knowsAbout\":[\"Python\",\"R\",\"Data Science\",\"AI\",\"SQL\",\"Data Engineering\"],\"knowsLanguage\":[\"Nederlands\",\"Engels\"],\"jobTitle\":\"Data Scientist & AI Engineer\",\"worksFor\":\"Data Science Partners\",\"url\":\"https:\\\/\\\/datasciencepartners.nl\\\/author\\\/peter-tieleman\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Decorators in Python: uitleg & voorbeelden [TUTORIAL]","description":"Decorators in Python zijn handig voor wie met functies in functies te maken heeft. Hier geven we simpele uitleg in een voorbeeld tutorial.","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:\/\/datasciencepartners.nl\/decorators-python\/","og_locale":"nl_NL","og_type":"article","og_title":"Decorators in Python: uitleg & voorbeelden [TUTORIAL]","og_description":"Decorators in Python zijn handig voor wie met functies in functies te maken heeft. Hier geven we simpele uitleg in een voorbeeld tutorial.","og_url":"https:\/\/datasciencepartners.nl\/decorators-python\/","og_site_name":"Data Science Partners | Trainingen Data Science in Python, SQL &amp; R","article_publisher":"https:\/\/www.facebook.com\/Data-Science-Partners-102566501086560","article_published_time":"2020-12-08T07:54:47+00:00","article_modified_time":"2023-05-03T11:38:25+00:00","og_image":[{"width":1500,"height":737,"url":"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2020\/12\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg","type":"image\/jpeg"}],"author":"Peter Tieleman","twitter_card":"summary_large_image","twitter_misc":{"Geschreven door":"Peter Tieleman","Geschatte leestijd":"9 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/datasciencepartners.nl\/decorators-python\/#article","isPartOf":{"@id":"https:\/\/datasciencepartners.nl\/decorators-python\/"},"author":{"name":"Peter Tieleman","@id":"https:\/\/datasciencepartners.nl\/#\/schema\/person\/2446edb5fdc88e86d93d270c736a8803"},"headline":"Decorators in Python: uitleg &#038; voorbeelden [TUTORIAL]","datePublished":"2020-12-08T07:54:47+00:00","dateModified":"2023-05-03T11:38:25+00:00","mainEntityOfPage":{"@id":"https:\/\/datasciencepartners.nl\/decorators-python\/"},"wordCount":1820,"publisher":{"@id":"https:\/\/datasciencepartners.nl\/#organization"},"image":{"@id":"https:\/\/datasciencepartners.nl\/decorators-python\/#primaryimage"},"thumbnailUrl":"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2020\/12\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg","articleSection":["Python","Tutorial"],"inLanguage":"nl-NL"},{"@type":"WebPage","@id":"https:\/\/datasciencepartners.nl\/decorators-python\/","url":"https:\/\/datasciencepartners.nl\/decorators-python\/","name":"Decorators in Python: uitleg & voorbeelden [TUTORIAL]","isPartOf":{"@id":"https:\/\/datasciencepartners.nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/datasciencepartners.nl\/decorators-python\/#primaryimage"},"image":{"@id":"https:\/\/datasciencepartners.nl\/decorators-python\/#primaryimage"},"thumbnailUrl":"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2020\/12\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg","datePublished":"2020-12-08T07:54:47+00:00","dateModified":"2023-05-03T11:38:25+00:00","description":"Decorators in Python zijn handig voor wie met functies in functies te maken heeft. Hier geven we simpele uitleg in een voorbeeld tutorial.","breadcrumb":{"@id":"https:\/\/datasciencepartners.nl\/decorators-python\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/datasciencepartners.nl\/decorators-python\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/datasciencepartners.nl\/decorators-python\/#primaryimage","url":"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2020\/12\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg","contentUrl":"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2020\/12\/decorators-python-uitleg-met-tutorial-en-voorbeelden.jpg","width":1500,"height":737,"caption":"decorators python uitleg met tutorial en voorbeelden"},{"@type":"BreadcrumbList","@id":"https:\/\/datasciencepartners.nl\/decorators-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/datasciencepartners.nl\/"},{"@type":"ListItem","position":2,"name":"Decorators in Python: uitleg &#038; voorbeelden [TUTORIAL]"}]},{"@type":"WebSite","@id":"https:\/\/datasciencepartners.nl\/#website","url":"https:\/\/datasciencepartners.nl\/","name":"Data Science Partners | Trainingen Data Science & AI in Python, SQL & R","description":"","publisher":{"@id":"https:\/\/datasciencepartners.nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/datasciencepartners.nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/datasciencepartners.nl\/#organization","name":"Data Science Partners","url":"https:\/\/datasciencepartners.nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/datasciencepartners.nl\/#\/schema\/logo\/image\/","url":"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2021\/02\/data-science-partners.png","contentUrl":"https:\/\/datasciencepartners.nl\/wp-content\/uploads\/2021\/02\/data-science-partners.png","width":655,"height":329,"caption":"Data Science Partners"},"image":{"@id":"https:\/\/datasciencepartners.nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Data-Science-Partners-102566501086560","https:\/\/www.linkedin.com\/company\/23709861\/"],"description":"Data Science Partners helpt organisaties met Data Science & AI. We werken voornamelijk met Python, SQL & R. We geven trainingen en doen consultancy opdrachten.","email":"info@datasciencepartners.nl","telephone":"0202443146","legalName":"Data Science Partners B.V.","foundingDate":"2019-10-01","vatID":"NL863566261B01","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"11","maxValue":"50"}},{"@type":"Person","@id":"https:\/\/datasciencepartners.nl\/#\/schema\/person\/2446edb5fdc88e86d93d270c736a8803","name":"Peter Tieleman","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/secure.gravatar.com\/avatar\/bb4d292d1a92cd51cab3aa9697a6ed2fd45c819952fb923a01231e1282f5a0df?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/bb4d292d1a92cd51cab3aa9697a6ed2fd45c819952fb923a01231e1282f5a0df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bb4d292d1a92cd51cab3aa9697a6ed2fd45c819952fb923a01231e1282f5a0df?s=96&d=mm&r=g","caption":"Peter Tieleman"},"description":"Peter is een ervaren data scientist, AI engineer en python trainer. Na zijn studie aan de Technische Universiteit Delft heeft hij zich altijd bezig gehouden met data en diverse programmeertalen. Peter heeft veel data analyses uitgevoerd en processen geautomatiseerd met Python in productieomgevingen.","sameAs":["https:\/\/www.linkedin.com\/in\/petertieleman\/"],"honorificPrefix":"Heer","honorificSuffix":"Ir.","birthDate":"1988-05-26","gender":"mannelijk","knowsAbout":["Python","R","Data Science","AI","SQL","Data Engineering"],"knowsLanguage":["Nederlands","Engels"],"jobTitle":"Data Scientist & AI Engineer","worksFor":"Data Science Partners","url":"https:\/\/datasciencepartners.nl\/author\/peter-tieleman\/"}]}},"_links":{"self":[{"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/posts\/19067","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/comments?post=19067"}],"version-history":[{"count":1,"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/posts\/19067\/revisions"}],"predecessor-version":[{"id":20705,"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/posts\/19067\/revisions\/20705"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/media\/19068"}],"wp:attachment":[{"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/media?parent=19067"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/categories?post=19067"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/datasciencepartners.nl\/wp-json\/wp\/v2\/tags?post=19067"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}