Decorators are used:
1. For extending the behavior of functions, or injecting code in functions or sub-classes.
2. For adding responsibilities to individual object dynamically without affecting other objects.
3. For responsibilities that can be withdrawn.
4. When extension by sub-classing is impractical.
5. For checking permissions, modifying or tracking the arguments passed to a method, logging the calls to a specific method.