'''Decorators are the functions that add some functionalities to a given function. they don't change the function/structure of the function but just add a few lines of code below and after the function .
A wrapper is a function that provides a wrap-around another function. While using decorator ,all the code which is executed before our function that we passed as a parameter and also the code after it is executed belongs to the wrapper function. The purpose of the wrapper function is to assist us.
def dec1(func): # this is a decorator
def executor(): # this is a wrapper function
'''there are two ways to call a decorator ,
1. we can assign the value of the decorator to the original function
2. we can use @ sign before the declaration of the new function .
@dec1 # this is a symbol for the decorator ,it is equal to func1=dec1(func1)
print("this is the original function ")
# func1 =dec1(func1)
'''Advantages of decorators :
1.they help us to wrap different functions around some code we want to be executed before and after the function
2. multiple decorators can be used with a single function
3. We can use decorators in authorization in Python frameworks such as measuring execution time.'''
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
this is the original function