ПредишенСледващото

Функции в Python - обекти

За да се разбере най-декоратори, първо трябва да осъзнаем, че всички функции в Python е обект. Което води до редица последствия. Обмислете ги един прост пример:

Сега, не забравяйте този пример, ние ще се върнем към него. Друга функция, функции в Python е, че те могат да бъдат обявени в рамките на друга функция!

Позоваванията на функции

Все още не се бърка? И сега най-интересната част. Тъй като функцията е нищо повече от един обект, поради което:

  • те могат да бъдат причислени към една променлива
  • те могат да бъдат декларирани в рамките на друга функция

Това означава, че функцията може да се върне друга функция в резултат на:

Спри! Това не е всичко! Ако можете да се върнете функция, както и да премине като параметър също така е възможно.

Но като цяло, както и всичко, което трябва да знаете за декоратори. Това е, декоратори е нещо като черупка. Те ви позволяват да изпълни код преди и след функцията, която те заобикаля, без да променя функцията.

домашно приготвени декоратори

Как да ги правят на ръка?

Сега, трябва да направите така, че всеки път, когато ти се обадя a_stand_alone_function функция. вместо това тя репетира a_stand_alone_function_decorated функция. Това е доста проста, просто се върнете my_shiny_new_decorator функция на a_stand_alone_function.

излагайки декоратори

В предишния пример използвахме следния синтаксис декоратор:

Декоратори е версия на дизайна на модела за украсяване на Python. Като цяло някои класически модели, включени в Python, за да се улесни процеса на развитие, като итератори.

Разбира се, че могат да се натрупат декоратори:

Декоратори използват синтаксиса в Python:

Редът на въпросите на декоратори:

И накрая, отговорът на въпроса

В заключение, може да видите отговора на един въпрос:

По принцип е възможно да се спре, но ако желанието не е отишло да научат нещо ново за декоратори, четете нататък.

Предаване на параметри на функции, заобиколени от декоратор

Използване декоратори методи

Както може да се предположи, са по същество методи и функции са същите в Python, с изключение, че методите трябва да получат позоваване на основния обект като първи параметър (самостоятелно). Това означава, че декораторите за тях са построени точно по същия начин. Само не забравяйте за себе си:

Разбира се, за да се създаде глобален декоратор, който ще се използва за всички функции и методи, трябва да използвате опцията * и ** kwargs.

Параметрите на предаването, декоратори

Добре, какво ще кажеш на аргументите на трансфер темата за декоратор? Има един малък трик. В действителност декоратор отнема само като функция на параметъра и не може да премине аргументи на функцията директно заобиколен от декоратор.

Преди да ви покажа решение на проблема, нека да разгледаме един пример:

Нищо не се е променило. Има my_decorator на повикване. Така че, когато вие казвате @my_decorator Задава мишена Python да извикате функция на декоратор.

Нищо чудно. Нека да направим едни и същи неща, но липсват помощни променливи:

Забелязах? Ние използваме функция разговор с синтаксис @. Да се ​​върнем към декоратори с аргументи. Ако приложим функцията за генериране на декораторите по време на път, а след това може да премине аргументи на функцията, не е тя?

Тук имате декоратор с аргументи, които могат да се задават с помощта на променливи.

Както можете да видите, всеки декоратор да предавате параметри в този подход. Нищо не пречи да използвате * аргументи и ** kwargs. Но не забравяйте, че декоратори се наричат ​​само веднъж. Само когато Python внася сценария. Това е динамично зададете стойности на тези променливи, не можете. Когато импортирате скрипт, функцията вече използва декоратор, така че да се промени нещо по-късно няма да работи.

Друг пример: декоратор декориране декоратор на

Ето такъв бонус. Ето фрагмент от кода на всеки декоратор вземе всеки параметър. В резултат на това да се премине аргументи, ние създадохме нашия декоратор с помощта на спомагателна функция. Нека да напише декоратор за декоратори:

Един пример за използването му:

Да, това изглежда по следния начин: "За да се разбере рекурсия, първо трябва да се разбере рекурсия." Но в крайна сметка той не е имал усещането, че сте усвоили нещо ново и интересно?

Правилното използване на декоратори

  • Декоратори забавят функции. Да не забравяме за това.
  • Извадете декоратор с функция е невъзможно. Разбира се, има примери за това как да го направя, но никой не идва. Така че, ако сте използвали декоратор, а след това ще трябва да работят в рамките на кода.
  • Декоратори заобикалят функция, което ги прави трудни за отстраняване на грешки.

Python 2.5 и по-горе, е разтвор на последното проблема. Тя включва functools модул (functools.wraps), който копира името на модула и записва всяка функция zadekoriovannoy. Най-интересното - functools.wraps е декоратор.

Кога да се прилага декоратори?

Основният въпрос - кога, всъщност, се прилага декоратори? Разбира се, че изглежда страхотно, но къде да ги използвам? Мога да ви дам най-малко 1000 примери. Един класически пример - добавяне на функционалност към функцията на библиотека на трета страна (която не можете да променяте). Можете да кандидатствате декоратори да разшири броя на функции, така че да не ги пренапише всеки път. Това елиминира ненужните код:

Най-интересното е, че можете да използвате декоратори почти мигновено, без пренаписване на съществуващия код:

Свързани статии

Подкрепете проекта - споделете линка, благодаря!