Decorator examples


Function-based decorator:

  • It simply extends function behaviour.
    import functools

    def decorate_funct(f):
        """ Decorator function: start_stop104 """

        @functools.wraps(f)
        def function_wrapper_level_one(*args, **kwargs):
            # Do something ...
            results = f(*args, **kwargs)
            # Do something ...
            return results

        return function_wrapper_level_one


    @decorate_funct
    def funct():
        return 100


    X = funct()
    print(X)

Class-based decorator:

  • It is used typically to maintain state.
    class CountCalls:

        def __init__(self, func):
            self.func = func
            self.num_calls = 0

        def __call__(self, *args, **kwargs):
            self.num_calls += 1
            print("Number of calls:", self.num_calls)
            return self.func(*args, **kwargs)

    @CountCalls
    def say_hello():
        print("hello")

    say_hello()

Function-based decorator, but for class:

Przykład dekoratora dla klasy:
    def add_method(cls):
        def new_method(self):
            return "Nowa metoda w klasie!"

        # Dodajemy metodę do klasy
        cls.new_method = new_method
        return cls

    @add_method
    class MyClass:
        def __init__(self, name):
            self.name = name

        def greet(self):
            return f"Hello, {self.name}!"