This document discusses Python decorators. Decorators allow functions to be modified or extended without permanently changing them. Decorators are functions that take other functions as arguments and return modified functions. The @ syntax is used to decorate a function, which is equivalent to calling the decorator on the function. Decorators can be used to add logging, timing, caching, and other functionality to existing functions without changing the code. Well-designed decorators allow the decorated function to be called normally while changing its behavior behind the scenes.