Decorateurs in Python zijn in feite functies die een andere functie als argument nemen en een nieuwe functie met verbeterde mogelijkheden retourneren. Ze worden veel gebruikt in situaties waar code moet worden toegevoegd aan bestaande functies op een manier dat de functionaliteit verandert, maar zonder de actuele code van de functie te wijzigen.
Een decorateur wordt aangegeven door ‘@’ vóór de functienaam.
Als voorbeeld zullen we een simpele decorateur maken die het aantal keren bijhoudt dat een bepaalde functie is aangeroepen:
```
def teller(func):
def helper(x):
helper.count += 1
print(“Aantal aanroepen van de functie: “ + str(helper.count))
return(func(x))
helper.count = 0
return helper
@teller
def groet(bericht):
print(bericht)
groet(“Hallo”)
groet(“Hi”)
```
In het bovenstaande voorbeeld, `teller` is de decorateur. De `@teller` vóór de `groet`-functie roept de decorateur aan met de`groet` functie als argument. Elke keer dat de`groet` functie wordt aangeroepen, zal de `helper.count` met 1 verhogen.
Het belangrijkste om te onthouden over decorateurs is dat ze zijn bedoeld om de functionaliteit van bestaande functies uit te breiden zonder hun code te wijzigen. Ze kunnen worden gebruikt om logboekregistratie, timing, enforces types, enz. toe te voegen of zelfs de functionaliteit volledig te wijzigen, zoals bij memoization of singleton klassen.