Мазмунга өтүү

Өркүндөтүлгөн декораторлор

Сабактын башталышы

Өркүндөтүлгөн декораторлор

Параметрленген декораторлор, класс декораторлору, катмарлоо жана 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тин ар бир чакырылышы үч жолу кайталанат.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө