Ланцюжкове та стекове використання декораторів
Свайпніть щоб показати меню
Під час роботи з декораторами у Python часто виникає потреба застосувати більше одного декоратора до однієї функції. Це називається стекуванням або ланцюжком декораторів. Щоб стекувати декоратори, розміщуйте кілька рядків декораторів один за одним безпосередньо над визначенням функції. Порядок, у якому ви стекуєте декоратори, має значення, оскільки він впливає на те, як функція обгортається і як кожен декоратор взаємодіє з іншими. Декоратор, який знаходиться найближче до функції, застосовується першим, а кожен наступний декоратор обгортає результат попереднього. Це означає, що декоратор у верхній частині стека є найзовнішнім обгортанням, а той, що найближче до функції, — найвнутрішнім.
У наведеному нижче прикладі визначено два декоратори: decorator_one та decorator_two, які стекуються над функцією greet. Порядок стекування визначає, як застосовуються декоратори.
123456789101112131415161718192021222324252627# Prints messages before and after the function call def decorator_one(func): def wrapper(*args, **kwargs): print("Decorator One: Before") result = func(*args, **kwargs) print("Decorator One: After") return result return wrapper # Also prints messages before and after the function call def decorator_two(func): def wrapper(*args, **kwargs): print("Decorator Two: Before") result = func(*args, **kwargs) print("Decorator Two: After") return result return wrapper # Stacking decorators # decorator_two is applied first (innermost), # then decorator_one wraps the result (outermost) @decorator_one @decorator_two def greet(name): print(f"Hello, {name}!") greet("Alice")
Зверніть увагу, що спочатку до decorator_two застосовується greet, а потім результат обгортається decorator_one. Це означає, що декоратор, який знаходиться найближче до функції, є найвнутрішнішим, а найверхніший — найзовнішнішим. Порядок накладання декораторів має значення, оскільки він впливає на поведінку декорованої функції.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат