Использование декораторов в Python: понятно и просто

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

В настоящее время декораторы в Python имеют множество применений: от кеширования данных до временного отключения операций. Эти инструменты работают на основании ключевых слов Python, таких как functools, time, logging, в рамках приемлемой практики, снижая код и повышая читаемость.

В данной статье мы рассмотрим, как создать и использовать декораторы в Python, чтобы вы могли применять это знание к своим проектам и повышать эффективность своих функций.

Краткий обзор декораторов

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

Одним из примеров декоратора является использование тега «@staticmethod». Этот декоратор используется для определения метода, который не имеет доступа к атрибутам класса и имеет указатель на текущий экземпляр.

Другим примером декоратора является использование тега «@wrapper». Этот декоратор используется для определения функции, которая оборачивает другую функцию и позволяет изменить ее поведение, не изменяя саму функцию.

Декораторы позволяют улучшить читаемость кода и общую структуру программы. Они также помогают избежать повторов кода и упрощают отладку модулей.

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

В Python есть множество готовых декораторов, которые можно использовать в своих проектах. Также вы можете создавать свои собственные декораторы, чтобы улучшить функциональность вашей программы.

Основы

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

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

Для создания декоратора мы можем использовать специальный синтаксис с символом @. Примером может служить декоратор @property, который используется для создания геттеров и сеттеров для свойств объекта.

Также в Python есть встроенные декораторы, такие как @staticmethod и @classmethod. @staticmethod используется для создания метода, который не принимает self как первый аргумент, а @classmethod — для создания метода, который принимает класс в качестве первого аргумента, а не экземпляр.

Кроме того, мы можем создавать свои собственные декораторы, используя функции и классы. Например, мы можем создать декоратор, который засекает время выполнения функции, декоратор, который логирует вызовы функции, и т.д.

В целом, декораторы — это мощный и гибкий инструмент в Python, который может существенно упростить написание кода и облегчить его поддержку. Однако, чтобы использовать декораторы правильно, необходимо хорошо понимать их принципы работы и использовать их с умом.

Что такое декоратор?

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

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

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

В оформлении декораторов обычно используются символы ‘@’ и ‘()’. Например, ‘@decorator_func()’ — это применение декоратора ‘decorator_func’ к функции. Также возможны цепочки декораторов, где несколько декораторов применяются последовательно к одной функции.

Использование декораторов может быть очень полезным при написании более сложных программ и библиотек, поэтому их понимание и умение использовать является важным навыком для питон-разработчика.

Пример декоратора

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

Допустим, у нас есть функция, которая складывает два числа и возвращает результат:

«`python

def add(a, b):

return a + b

«`

Мы хотим добавить возможность автоматического логирования каждого вызова функции и его результата. Для этого мы можем создать декоратор:

«`python

def logger(function):

def wrapper(*args, **kwargs):

result = function(*args, **kwargs)

print(f»Вызвана функция {function.__name__} с аргументами {args} и {kwargs}. Результат: {result}»)

return result

return wrapper

«`

Этот декоратор принимает функцию и возвращает новую функцию-обёртку, которая будет выполнена вместо исходной функции.

Мы можем применить декоратор к нашей функции add с помощью символа @:

«`python

@logger

def add(a, b):

return a + b

«`

И теперь при вызове функции add будет автоматически выполняться логирование:

«`python

result = add(2, 3)

# Вывод: Вызвана функция add с аргументами (2, 3) и {}. Результат: 5

«`

Таким образом, мы использовали декоратор, чтобы добавить новое поведение к нашей функции, не изменяя её исходный код.

Как работают декораторы в Python?

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

Допустим, у нас есть функция, которая складывает два числа:

def add_numbers(a, b):

return a + b

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

def positive_numbers(func):

def wrapper(a, b):

if a < 0 or b < 0:

raise ValueError("Arguments must be positive")

return func(a, b)

return wrapper

@positive_numbers

def add_numbers(a, b):

return a + b

Здесь мы создали декоратор positive_numbers, который проверяет, являются ли переданные аргументы положительными числами. Если это не так, то генерируется исключение ValueError. Затем мы применили этот декоратор к функции add_numbers с помощью специального синтаксиса @positive_numbers.

При вызове функции add_numbers теперь сначала будет вызван декоратор positive_numbers, который проверит переданные аргументы. Если они проходят проверку, то вызовется сама функция add_numbers, иначе будет сгенерировано исключение ValueError.

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

Декораторы функций

Декораторы функций в Python представляют собой специальные объекты, которые позволяют вносить изменения в поведение существующих функций без их изменения. В основном декораторы используются для добавления новой функциональности, изменения параметров вызова функций и т.д.

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

Для того, чтобы применить декоратор к функции, декоратор нужно просто указать перед определением функции с помощью символа ‘@’. Например:

@decorator

def my_function():

# код функции

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

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

  • Пример: Декоратор @timeit

Один из наиболее распространенных декораторов это @timeit, который позволяет измерить время выполнения функции. Пример его использования:

import time

def timeit(func):

def wrapper(*args, **kwargs):

start = time.time()

result = func(*args, **kwargs)

print(‘Время выполнения функции: ‘, time.time() — start)

return result

return wrapper

@timeit

def my_function():

# код функции

В этом примере декоратор timeit возьмет на себя заботу о замере времени выполнения функции my_function и вернет на выходе время выполнения.

Синтаксис декораторов функций

Декоратор функций — это функция, которая принимает функцию в качестве аргумента и возвращает другую функцию. Она может использоваться для изменения поведения функции, не изменяя ее код. В Python, декораторы описываются с использованием символа @, за которым следует имя декоратора.

Например, чтобы применить декоратор ‘my_decorator’ к функции ‘function_to_decorate’, мы напишем:

@my_decorator

def function_to_decorate():

  print(«Something»)

Это то же самое, что и написание:

function_to_decorate = my_decorator(function_to_decorate)

def function_to_decorate():

  print(«Something»)

Таким образом, мы можем использовать декораторы для добавления нового поведения к функции, например, для измерения времени выполнения или для логирования параметров.

В Python, декораторы могут также быть объединены в цепочку, когда несколько декораторов применяются к одной функции. Например,:

@decorator1

@decorator2

def function_to_decorate():

  print(«Something»)

Это эквивалентно следующему коду:

function_to_decorate = decorator1(decorator2(function_to_decorate))

def function_to_decorate():

  print(«Something»)

Эти два эквивалентных варианта демонстрируют, как происходит последовательное применение декораторов.

Пример использования декоратора функции

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

Примером использования декоратора функции может быть декоратор @staticmethod в Python. Этот декоратор используется для создания статических методов в классе, которые вызываются непосредственно от класса, а не от объекта.

В следующем примере мы создадим класс, содержащий статический метод, и применим декоратор @staticmethod к этому методу. Затем мы вызовем этот статический метод напрямую от класса:

class MyClass:

@staticmethod

def my_static_method(x, y):

print(x + y)

MyClass.my_static_method(5, 10)

Результат выполнения этого кода будет «15», что является суммой аргументов x и y, переданных в метод my_static_method. Обратите внимание, что мы вызываем этот метод непосредственно от класса MyClass, а не от объекта этого класса.

Другим примером использования декоратора функции может быть декоратор @timer в Python. Этот декоратор может использоваться для измерения времени выполнения функции и вывода результатов на экран.

В следующем примере мы создадим функцию, содержащую декоратор @timer, и вызовем эту функцию с некоторыми аргументами:

import time

def my_function(x, y):

time.sleep(1)

return x + y

def timer_decorator(func):

def wrapper(*args, **kwargs):

start_time = time.time()

result = func(*args, **kwargs)

end_time = time.time()

print("Time:", end_time - start_time)

return result

return wrapper

my_decorated_function = timer_decorator(my_function)

print(my_decorated_function(5, 10))

Результат выполнения этого кода будет «Time: 1.000976800918579», что является временем выполнения функции my_function в секундах. Обратите внимание, что мы вызываем обернутую функцию my_decorated_function с теми же аргументами, что и у исходной функции my_function.

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

Обычно декоратор функции создается без аргументов:

«`python

def my_decorator(func):

def wrapper():

print(«Something is happening before the function is called.»)

func()

print(«Something is happening after the function is called.»)

return wrapper

@my_decorator

def say_hello():

print(«Hello!»)

say_hello()

«`

Но можно создать декоратор с аргументами:

«`python

def my_decorator_with_args(number):

def decorator(func):

def wrapper():

print(«Something is happening before the function is called.»)

func()

print(f»Number passed to decorator is {number}.»)

print(«Something is happening after the function is called.»)

return wrapper

return decorator

@my_decorator_with_args(56)

def say_hello():

print(«Hello!»)

say_hello()

«`

При вызове декоратора с аргументами, мы получаем объект-функцию decorator, который внутри своего замыкания хранит указанный аргумент number. Затем, когда мы применяем декоратор к функции, мы передаем функцию в объект-функцию decorator, которая теперь хранит внутри func.

Теперь, когда мы вызываем функцию say_hello(), мы на самом деле вызываем функцию-обертку wrapper(), которая сначала выполняет какой-то код, затем вызывает оригинальную функцию say_hello() и после этого снова выполняет какой-то код. При этом функция-обертка wrapper() имеет доступ к аргументу number, переданному в декоратор.

Декораторы классов

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

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

Для использования декоратора класса следует создать класс-обертку, который принимает декорируемый класс в качестве аргумента. Например:

def my_decorator(cls):

class Wrapper:

def __init__(self, *args, **kwargs):

self.wrapped = cls(*args, **kwargs)

def decorated_method(self, *args, **kwargs):

# do some action before method call

result = self.wrapped.my_method(*args, **kwargs)

# do some action after method call

return result

return Wrapper

В данном примере мы создаем декоратор класса my_decorator, который возвращает обертывающий класс Wrapper, который при создании экземпляра сохраняет исходный класс, а при вызове его метода выполняет какие-то действия перед и после вызова декорируемого метода my_method.

Чтобы применить декоратор к классу, следует пометить его атрибут @decorator перед объявлением класса. Например:

@my_decorator

class MyClass:

def my_method(self):

# do something

pass

В данном примере класс MyClass декорируется декоратором my_decorator, который добавляет функциональность к его методу my_method.

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

Синтаксис декораторов классов

Декораторы классов в Python позволяют модифицировать классы. Синтаксис декораторов классов выглядит следующим образом:

@decorator

class MyClass:

    def __init__(self):

        pass

Здесь декоратор обозначается символом @, за которым следует имя декоратора. Далее идет определение класса MyClass.

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

Также можно использовать несколько декораторов для класса. В таком случае они выполняются сверху вниз.

Пример декоратора, добавляющего новый метод в класс:

def add_method(cls):

    cls.new_method = lambda self: print(«Hello world!»)

    return cls

@add_method

class MyClass:

    def __init__(self):

        pass

obj = MyClass()

obj.new_method()

В данном примере определяется функция-декоратор add_method, которая добавляет в класс метод new_method. После этого класс MyClass декорируется этой функцией и создается объект obj, вызов которого нового метода выводит на экран сообщение «Hello world!».

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

Пример использования декоратора класса

Декораторы класса в Python позволяют добавлять новое поведение к классу, не изменяя его код непосредственно. Они используются для добавления новых методов, атрибутов или даже изменения логики работы объекта. Ниже приведен пример использования декоратора класса.

Создадим класс Person, который будет иметь два атрибута: имя и возраст:

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

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

def to_dict(cls):

def wrapper(*args, **kwargs):

instance = cls(*args, **kwargs)

return {

'name': instance.name,

'age': instance.age

}

return wrapper

@to_dict

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

Теперь мы можем создавать экземпляр класса Person и легко преобразовывать его в словарь:

p = Person('John', 25)

print(p.to_dict()) # {'name': 'John', 'age': 25}

Это всего лишь пример использования декоратора класса. С их помощью можно добавлять новые методы, изменять существующие и вообще делать все, что угодно, чтобы улучшить функциональность и гибкость наших классов в Python.

Передача аргументов в декоратор класса

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

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

Например, рассмотрим следующий код:

def my_decorator(arg1, arg2):

def wrapper(cls):

cls.new_attr1 = arg1

cls.new_attr2 = arg2

return cls

return wrapper

@my_decorator(arg1='hello', arg2='world')

class MyClass:

pass

print(MyClass.new_attr1) # hello

print(MyClass.new_attr2) # world

В данном примере мы создаем декоратор класса «my_decorator», который принимает два аргумента – arg1 и arg2. Функция-обертка «wrapper» добавляет два новых атрибута к классу – «new_attr1» и «new_attr2», которые получают значения из переданных аргументов.

Затем мы применяем декоратор к нашему классу MyClass, передавая значения аргументов «hello» и «world». После этого мы можем убедиться, что атрибуты «new_attr1» и «new_attr2» были успешно добавлены к классу, путем их вывода на консоль.

Таким образом, передача аргументов в декоратор класса является мощным инструментом для настройки поведения классов в Python. Благодаря этой возможности, мы можем добиться гибкости и универсальности в написании кода, а также избежать дублирования кода при написании разных версий классов с различными настройками.

Продвинутые техники

Декораторы в Python могут быть использованы для более продвинутых техник. Одна из таких техник — создание декораторов с аргументами. Декоратор с аргументами может использоваться для динамического изменения поведения функции на основе переданных аргументов.

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

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

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

Пример создания декоратора с аргументами:
КодОписание
@decorator

def my_function(arg):

print(arg)

def decorator(func):

def wrapper(*args):

print("Before function")

func(*args)

print("After function")

return wrapper

my_function("Hello world!")
Данный декоратор может принимать аргументы и изменять поведение функции на основе переданных данных. В данном случае, он добавляет дополнительный вывод «Before function» и «After function». Результат выполнения данного кода будет:

Before function

Hello world!

After function

Декораторы с параметрами

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

Например, можно написать декоратор, принимающий аргумент — максимальное значение допустимого результата функции:

def max_result(limit):

def decorator(func):

def wrapper(*args, **kwargs):

result = func(*args, **kwargs)

if result > limit:

print(f"Результат функции {func.__name__} превышает {limit}.")

else:

return result

return wrapper

return decorator

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

@max_result(10)

def multiply(a, b):

return a * b

multiply(3, 4) # вернет 12

multiply(5, 5) # выведет "Результат функции multiply превышает 10."

Также можно написать декоратор, принимающий аргументы и использующий их для настройки поведения декорируемой функции:

def repeat(num):

def decorator(func):

def wrapper(*args, **kwargs):

for i in range(num):

func(*args, **kwargs)

return wrapper

return decorator

Этот декоратор будет запускать декорируемую функцию заданное количество раз:

@repeat(3)

def greet(name):

print(f"Привет, {name}!")

greet("Миша")

Этот код выведет:

Привет, Миша!

Привет, Миша!

Привет, Миша!

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

Пример использования декоратора с параметрами

Декораторы в Python могут принимать параметры — это позволяет настраивать их поведение для конкретной задачи. Рассмотрим пример использования декоратора с параметрами:

def multiply_by(n):

def decorator(func):

def wrapper(*args, **kwargs):

result = func(*args, **kwargs)

return result * n

return wrapper

return decorator

@multiply_by(3)

def add(a, b):

return a + b

print(add(2, 3)) # Вывод: 15

В данном примере мы создаем декоратор multiply_by, который принимает параметр n. Далее мы определяем внутренний декоратор decorator, который принимает функцию func в качестве параметра. В свою очередь, внутри декоратора decorator определяется функция-обертка wrapper, которая вызывает исходную функцию func и умножает результат на параметр n.

Затем мы используем декоратор multiply_by для декорирования функции add, передав значение 3 в качестве аргумента. Таким образом, при вызове функции add результат ее работы будет умножен на 3.

Когда мы вызываем функцию add с аргументами 2 и 3, получаем результат 5, который умножается на 3, таким образом, функция возвращает значение 15.

Стек декораторов

В Python возможна композиция декораторов, когда несколько декораторов применяются к функции последовательно.

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

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

Пример:

  • Декоратор a добавляется первым в стек.
  • Декоратор b добавляется в стек поверх декоратора a.
  • Функция func добавляется в стек поверх декоратора b.
СтекВызов
funcfunc()
b(a(func))b(a(func))
a(func)a(func)

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

Таким образом, композиция декораторов позволяет использовать их совместно, создавая различные комбинации функционала.

Пример использования стека декораторов

Декораторы – это один из важных механизмов языка Python, который позволяет изменять поведение функций. Использование стека декораторов позволяет навешивать декораторы друг на друга и влиять на работу функции.

Давайте представим, что у нас есть функция для вычисления произведения чисел:

def multiply_numbers(a, b):

return a * b

Если мы хотим проверять, что в функцию передаются только целые числа, мы можем написать декоратор:

def integers_only(func):

def wrapper(*args, **kwargs):

if all(isinstance(arg, int) for arg in args):

return func(*args, **kwargs)

else:

raise ValueError("Only integers allowed")

return wrapper

Теперь мы можем добавить этот декоратор к нашей функции:

@integers_only

def multiply_numbers(a, b):

return a * b

Теперь функция будет принимать только целые числа. Но что, если мы также хотим ограничить значения, которые могут быть переданы в функцию?

Мы можем написать еще один декоратор для проверки диапазона значений:

def limit_values(lower, upper):

def decorator(func):

def wrapper(*args, **kwargs):

if all(lower <= arg <= upper for arg in args):

return func(*args, **kwargs)

else:

raise ValueError(f"Values must be between {lower} and {upper}")

return wrapper

return decorator

Теперь мы можем использовать оба декоратора для нашей функции:

@integers_only

@limit_values(0, 100)

def multiply_numbers(a, b):

return a * b

Теперь функция будет принимать только целые числа и значения, которые находятся в диапазоне от 0 до 100.

Использование стека декораторов в Python может быть очень полезным, когда мы хотим комбинировать несколько декораторов для нашей функции.

FAQ

Для чего используются декораторы в Python?

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

В чем разница между декоратором и обычной функцией?

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

Ссылка на основную публикацию
Adblock
detector