11.2. Декораторы.

Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Самоучитель Python 3, собранный из материалов данного сайта. Предназначен в основном для тех, кто хочет изучить язык программирования Python с нуля.

Декораторы - это инструмент Python, который позволяет изменять поведение функций, методов классов и других объектов без изменения исходного кода. Они используются для добавления дополнительного функционала к существующим объектам, обертывая их в другие функции. Давайте подробно рассмотрим, что такое декораторы и как их использовать, с примерами:
 
Определение декоратора
Декоратор в Python - это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию. Эта новая функция обычно расширяет или изменяет поведение исходной функции, добавляя к ней дополнительный функционал. Пример определения декоратора:
def my_decorator(func):
    def wrapper():
        print("Дополнительный код перед вызовом функции")
        func()
        print("Дополнительный код после вызова функции")
    return wrapper
 
Использование декоратора
Чтобы использовать декоратор, вы просто помещаете символ `@` перед определением функции, к которой хотите применить декоратор, и указываете имя декоратора.
@my_decorator
def say_hello():
    print("Привет, мир!")

say_hello()
При вызове функции `say_hello()` вывод будет выглядеть следующим образом:
Дополнительный код перед вызовом функции
Привет, мир!
Дополнительный код после вызова функции
 
Передача аргументов в декорируемую функцию
Если ваша функция принимает аргументы, вы можете передать их через декоратор, используя `*args` и `**kwargs`.
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Дополнительный код перед вызовом функции")
        func(*args, **kwargs)
        print("Дополнительный код после вызова функции")
    return wrapper

@my_decorator
def greet(name):
    print("Привет, {}!".format(name))

greet("Мир")
 
Декорирование методов класса
Декораторы также могут использоваться для декорирования методов класса.
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Дополнительный код перед вызовом метода")
        func(*args, **kwargs)
        print("Дополнительный код после вызова метода")
    return wrapper

class MyClass:
    @my_decorator
    def greet(self, name):
        print("Привет, {}!".format(name))

obj = MyClass()
obj.greet("Мир")
 
Многоуровневые декораторы
Вы можете применять несколько декораторов к одной функции или методу.
def uppercase(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

def bold(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return "<b>{}</b>".format(result)
    return wrapper

@bold
@uppercase
def greet(name):
    return "Привет, {}!".format(name)

print(greet("Мир"))
В этом примере сначала применяется декоратор `uppercase`, который преобразует результат в верхний регистр, а затем `bold`, который обрамляет результат в тег `<b>`.

категории

ТЕОРИЯ

  • Введение в Python
  • Основы программирования на Python
  • Управляющие конструкции
  • Структуры данных
  • Функции и модули
  • Обработка исключений
  • Работа с файлами и потоками
  • файловая система
  • Объектно-ориентированное программирование (ООП)
  • Регулярные выражения
  • Дополнительные темы

Мы в соцсетях