Өркүндөтүлгөн декораторлор
Параметрленген декораторлор, класс декораторлору, катмарлоо жана functools куралдары
def же class оператору аткарылганда бир жолу иштейт жана объекттин өздүгүн кайра жаза алат, абал кошо алат, аны бир жерге каттай алат же өзүнүн конфигурациясын кабыл ала алат. Стандарттык китепкана functools модулунда өндүрүштүк сапаттагы декораторлорду сунуштайт, аларга өзүңдүкүн жазуудан мурда кайрылган оң.
- параметрленген декоратор (декоратор фабрикасы) жазуу жана анын үч чакыруу катмарын түшүндүрүү,
- аргументтер менен да, аргументтерсиз да иштеген декоратор куруу,
- класс декоратору түшүнүгүнүн эки маанисин ажыратуу жана экөөнү тең ишке ашыруу,
- катмарланган декораторлор колдонулган тартип жана алардын иштөө тартиби жөнүндө так ой жүгүртүү,
functools.wraps,lru_cache/cacheжанаsingledispatchколдонуу жана алардын чыныгы соодалашууларын айтуу.
1. Параметрленген декораторлор (декоратор фабрикалары)
Кадимки декоратор так бир аргумент кабыл алат: декораторлонуучу функцияны. Анда @lru_cache(maxsize=256) кантип аргумент кабыл алат? Кыйтыр - бир кошумча катмарда. @repeat(times=3) - бул декоратор эмес; бул декоратор кайтарган функция. Python адегенде repeat(times=3) эсептейт, анан ал эмнени кайтарса, ошол декоратор катары колдонулат. Бул параметрленген декораторго үч уяланган катмар берет.
import functools
def repeat(times): # 1-катмар: фабрика, тууралоону кабыл алат
def decorator(func): # 2-катмар: чыныгы декоратор, функцияны кабыл алат
@functools.wraps(func)
def wrapper(*args, **kwargs): # 3-катмар: орогуч, чакыруу аргументтерин кабыл алат
result = None
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def ping():
print("ping")
@repeat(times=3) дегенди эки кадам катары окугула: d = repeat(times=3) decorator кайтарат, анан ping = d(ping). Сырткы times тумалоо (closure) менен кармалат, ошондуктан декораторлонгон pingтин ар бир чакырылышы үч жолу кайталанат.