В данном уроке мы рассмотрим такое понятие как декоратор.
Данная понятие стало возможно благодаря тому, что функцию можно создавать, вызывать и возвращать из других функций. Конструктивно декоратор в Python представляет собой некоторую функцию, аргументом которой является другая функция. Декоратор предназначен для добавления дополнительного функционала к данной функции без изменения содержимого последней.
Для понимания как это работает, рассмотрим программный код:
from machine import Pin
import time
led1 = Pin(15, Pin.OUT)#D8
led2 = Pin(2, Pin.OUT)#D4
led3 = Pin(13, Pin.OUT)#D7
led4 = Pin(4, Pin.OUT)#D2
def all_off():
led1.off()
led2.off()
led3.off()
led4.off()
def my_prog1(fun_dekor):
def function1():
print (‘Led1’)
led1.on()
fun_dekor()
print (‘Led2’)
led2.on()
return function1
def my_prog2():
print(‘Led3’)
led3.on()
def my_prog3():
print(‘Led4’)
led4.on()
all_off()
my_prog2()
time.sleep(5)
all_off()
time.sleep(5)
print(‘ ‘)
#
#
my_prog2_decorated = my_prog1(my_prog2)
my_prog2_decorated()
time.sleep(5)
all_off()
time.sleep(5)
print(‘ ‘)
my_prog3_decorated = my_prog1(my_prog3)
my_prog3_decorated() time.sleep(5)
all_off()
print(‘END’)
В данном коде мы создаем подпрограмму, аргументом которой является функция:
def my_prog1(fun_dekor):
В данной подпрограмме мы сделаем функцию, которую получаем в качестве аргумента.
fun_dekor()
Далее создаем пару подпрограмм, в которых будем включать светодиоды:
def my_prog2(fun_dekor):
Теперь предположим нам надо, что бы процессы которые происходят в подпрограмме my_prog2 и my_prog3 происходили одновременно (по очереди) с действиями в подпрограмме my_prog1. Что бы не создавать две подпрограммы в которых прописываем данные действия, мы создаем одну подпрограмму my_prog1, где описываем общие условия для работы подпрограммы my_prog2 и my_prog3.
Данный подход удобен, если необходимо изменить алгоритм работы, изменения достаточно внести в одну функцию, а не переписывать весь код.
Вставка внутрь функции другую функцию:
my_prog2_decorated = my_prog1(my_prog2)
my_prog2_decorated()
Результат выполнения выше написаннойпрограммы :
В качестве визуализации я добавил светодиоды, сначала запустил функцию my_prog2(), а после символов ## добавил демонстрацию работы декоратора. Результат работы можно увидеть на видео.