Декораторы Python — это мощные инструменты, которые позволяют нам изменять или улучшать поведение функций или методов. Общие случаи использования включают ведение журнала, авторизацию и многое другое.
Однако, когда их просят определить декоратор, многие могут сказать:
Это оболочка функции.
Хотя это технически правильно, под капотом происходит гораздо больше.
Разбор простого декоратора
Давайте рассмотрим простой пример:
def my_decorator(func): def wrapper(*args, **kwargs): print("Before calling the function") result = func(*args, **kwargs) print("After calling the function") return result return wrapper @my_decorator def say_hello(name): print(f"Hello, {name}!")
Здесь my_decorator — это декоратор для функцииsay_hello. Когда параметрsay_hello определен, он автоматически передается в my_decorator, преобразуя вызов функции в:
Say_hello = my_decorator(say_hello)
Когда произойдет эта трансформация?
Это преобразование происходит во время компиляции кода, а именно во время определения функции, а не во время выполнения.
Дизассемблирование кода
Чтобы понять, как декораторы работают на более низком уровне, мы можем использовать модуль dis для проверки байт-кода декорируемой функции:
import dis @my_decorator def say_hello(name): print(f"Hello, {name}!") dis.dis(say_hello)
Разбивка байт-кода
Вывод команды dis.dis(say_hello) может выглядеть так:
Пояснение байт-кода
Перед вызовом функции
Вызов исходной функции
После вызова функции
Заключение
Декораторы Python — это больше, чем просто оболочки функций; они позволяют нам изменять поведение функции во время определения. Поняв, как они работают, и изучив байт-код, мы сможем более эффективно использовать декораторы в наших проектах.
На этом всё! Если вы хотите, чтобы я углубился в что-то еще, просто дайте мне знать!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3