Декораторы

Декораторы

@ProgHelpBot
  1. Декораторы
  2. Получение параметров функции в декораторе
  3. Получение результата функции

Декораторы

Представляют функцию, которая в качестве параметра получает функцию и в качестве результата также возвращает функцию. Декораторы позволяют модифицировать выполняемую функцию, значения ее параметров и ее результат без изменения исходного кода этой функции.

def select(input_func):  # функция декоратор
  def output_func():  # будет выполняться вместо оригинальной
    print("-------------")
    input_func()  # вызов оригинальной функции
    print("-------------")

  return output_func


@select  # применение декоратора
def say_hello():  # оригинальная функция
  print("Hello, World!")


say_hello()

Результат:

-------------
Hello, World!
-------------

Получение параметров функции в декораторе

Декоратор может перехватывать передаваемые в функцию аргументы. Для этого в качестве параметров функции output_func() передаётся список значений *args и затем каждый аргумент получается с помощью индекса: args[0], args[1] и так далее.

def check(input_func):
  def output_func(*args):
    name = args[0]
    age = args[1]
    if age < 0: age = 0
    input_func(name, age)
  return output_func

@check
def print_person(name, age):
  print(f"Name: {name}, age: {age}")


print_person("Alex", 38)  # Name: Alex, age: 38
print_person("Alice", -5)  # Name: Alice, age: 0

Получение результата функции

Подобным образом можно получить результат функции и при необходимости изменить его.

def check(input_func):
  def output_func(*args):
    result = input_func(*args)
    if result < 0: result = - result
    return result
  return output_func


@check
def multiply(a, b):
  return a * b


print(multiply(2, 5))  # 10
print(multiply(2, -5))  # 10


← Замыкания

→ Классы и объекты

Report Page