<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Decorators
Introduction
A decorator is the name used for a software design pattern. Decorators dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated.
Python decorator is a specific change to the Python syntax that allows us to more conveniently alter functions and methods (and possibly classes in a future version). This supports more readable applications of the DecoratorPattern but also other uses as well.
Step1:  Function Decorators
A function decorator is applied to a function definition by placing it on the line before that function definition begins
Step2:  !!! Order Matters !!!
Step3:  Decorators with arguments
Using Functions
We can create a function which can take an argument and
Step4:  Class Decorators
Bound methods
Unless you tell it not to, Python will create what is called a bound method when a function is an attribute of a class and you access it via an instance of a class. This may sound complicated but it does exactly what you want.
Step5:  staticmethod()
A static method is a way of suppressing the creation of a bound method when accessing a function.
Step6:  When we call a static method we don’t get any additional arguments.
Step7:  classmethod
A class method is like a bound method except that the class of the instance is passed as an argument rather than the instance itself.
<ASSISTANT_TASK:>
Python Code:
def bread(test_funct):
    def hyderabad():
        print("</''''''\>")
        test_funct()
        print("<\______/>")
    return hyderabad
def ingredients(test_funct):
    def chennai():
        print("#tomatoes#")
        test_funct()
        print("~salad~")
    return chennai
def cheese(food="--Say Cheese--"):
    print(food)
ch = bread(test_funct=cheese)
ch()
inn = bread(ingredients(cheese))
inn()
Explanation: Decorators
Introduction
A decorator is the name used for a software design pattern. Decorators dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated.
Python decorator is a specific change to the Python syntax that allows us to more conveniently alter functions and methods (and possibly classes in a future version). This supports more readable applications of the DecoratorPattern but also other uses as well.
End of explanation
@bread
@ingredients
def sandwich(food="--Say Cheese--"):
    print(food)
sandwich()
Explanation: Function Decorators
A function decorator is applied to a function definition by placing it on the line before that function definition begins
End of explanation
@ingredients
@bread
def sandwich(food="--Say Cheese--"):
    print(food)
sandwich()
@bread
@ingredients
def hotdog(food="Jam"):
    print(food)
hotdog()
def diet_sandwitch(inner_func):
    def inner():
        print("salad")
    return inner
@ingredients
@diet_sandwitch
def sandwich(food="--Say Cheese--"):
    print(food)
sandwich()
Explanation: !!! Order Matters !!!
End of explanation
def Names(test_funct):
    def inner():
        print("{Hello}")
        print("\tA-Priya")
        print("\tManish Gupta")
        print("\tNeha", end="\n\t")
        test_funct()
        print("(/Hello}")
    return inner
@Names
def print_AShanti():
    print("A-Shanti")
print_AShanti()
Explanation: Decorators with arguments
Using Functions
We can create a function which can take an argument and
End of explanation
class A(object):
    def method(*argv):
        return argv
a = A()
a.method
a.method('an arg')
Explanation: Class Decorators
Bound methods
Unless you tell it not to, Python will create what is called a bound method when a function is an attribute of a class and you access it via an instance of a class. This may sound complicated but it does exactly what you want.
End of explanation
class A(object):
    @staticmethod
    def method(*argv):
        return argv
a = A()
a.method
Explanation: staticmethod()
A static method is a way of suppressing the creation of a bound method when accessing a function.
End of explanation
a.method('an arg')
Explanation: When we call a static method we don’t get any additional arguments.
End of explanation
class A(object):
    @classmethod
    def method(*argv):
        return argv
a = A()
a.method
a.method('an arg')
def test(strg):
    print("Name: ", strg)
    
def hello(func, name):
    print("Ja")
    func(name)
    
hello(test, "Mayank")
class B(object):
    @classmethod
    def method(*argv):
        return argv
a = B()
a.method()
Explanation: classmethod
A class method is like a bound method except that the class of the instance is passed as an argument rather than the instance itself.
End of explanation
<END_TASK>