Всем привет,
В этой статье я постараюсь объяснить логику декораторов, которая является запутанным предметом для некоторых, как я могу. Но для лучшего понимания давайте сначала посмотрим на функцию и объекты, которые удерживают их.
def say_hello(): return "hello"
Когда мы определяем функцию, подобную тому, как один на вышеупомянутой, Python создает функциональный объект со своим тегом. Таким образом, вы можете представить объект с именем и некоторыми свойствами, которые возвращаются «Hello» при вызове. Так как мы доберемся до этого объекта?
print(say_hello()) print(say_hello)
Если мы запустим функции последовательно, как указано выше, мы получаем следующие выходы в том же порядке.
Привет <Функция say_hello at 0x000001ba3891d1f0>
Когда мы запускаем его как Say_Hello (), понимается, что это функция, и наше значение «Hello» возвращается. Но если мы распечатаем имя функции, чьи Имя Недвижимость Say_Hello, мы получаем вывод. Мы достигли объекта, поняли, что это был функциональный объект и узнал его адрес. Тогда я могу сохранить этот адрес в другой переменной, которую я хочу.
* * Так что происходит, если я назначу ценность? * *
Правда, оба показывают один и тот же объект, что и вывод, когда напечатан, потому что здесь «say_Hello» дал мне адрес объекта функционала, который он проводил, и Python назначил его «say_Hello2». Если я назначил (), то мое значение say_hello2 выводило бы «Hello», потому что я бы назначил значение функции, а не адрес объекта.
- Теперь, с тем, что мы узнали, давайте постепенно двигаться к логике декоратора. *
def say_hello_decorator(func): return func def say_hello(): return 'Hello ' say_hello = say_hello_decorator(say_hello) print(say_hello())
Когда я пишу код, подобный одному на вышеуказанном, функция Say_Hello_Decorator возвращает только функцию FUNC, а функция Say_Hello возвращает значение «Hello».
Давайте обратим внимание на часть say_hello (say_hello)
. Когда этот блок работает, Python назначает адрес объекта функции, который является значением Say_Hello, в другую переменную с именем «Func», которая является локальной переменной в функции. Так что теперь Func =. После этого, когда работает функция Say_Hello_Decorator, она возвращает адрес, он сохраняется в Func и присваивает тот же адрес для переменной Say_Hello. Когда мы запускаем его, функция Say_Hello начинает бегать, и мы получаем вывод Hello ‘.
** Ха, здесь мы приходим к главной части, Python говорит, вместо этого каждый раз занимаюсь, используют декораторы. * *
def say_hello_decorator(func): return func @say_hello_decorator #say_hello = say_hello_decorator(say_hello) def say_hello(): return 'Hello ' print(say_hello())
Как @say_hello_decorator, я могу перезаписать любую функцию, которую хочу, и она заменяет ее в качестве параметра. Цель использования декораторов – это написать более читаемый и чистый код. Теперь давайте немного усложним вещи:
def say_hello_decorator(func): def wrapper(): return func return wrapper @say_hello_decorator def say_hello(): return 'Hello ' print(say_hello())
Здесь мы дали say_hello_decorator адрес say_hello. Итак, мы получим один и тот же адрес снова или это адрес другой функции?
Как вы можете видеть, это отличается. Точка к примечанию здесь является утверждение Func (). Теперь наш декоратор начинает работать с FUNC локальной переменной, которая содержит старый адрес. Функция обертки запускает объект функции по адресу, которого мы отправили и возвращают «Hello». После этого, я могу делать все, что я хочу, чтобы моя функция в обертке как показано ниже, и я могу получить параметры.
def say_hello_decorator(func): def wrapper(name): val = func(name) print("Wrapper works") return val return wrapper @say_hello_decorator def say_hello(name): return 'Hello ' + name print(say_hello("Berkin Öztürk"))
Чтобы просмотреть последний раз, в первом мы имели функцию, называемую say_hello и ее возвращаемое значение «Hello». Добавив декоратор (say_hello_decorator) к этой функции, мы определили выражение (say_hello). Другими словами, мы отправили адрес функции в функцию. Таким образом, в функции say_hello_decorator мы либо отправляем функцию, которую мы отправили адрес обратно в функцию say_hello без внесения никаких изменений, либо добавляем новые функции и выполняем функцию say_hello на первом адресе. Но кроме того, если вы используете как в примере выше, вы можете выполнять определенные операции без выполнения функции в первом адресе.
В итоге; Функция Say_Hello_Decorator требует адреса, который Say_Hello держит, дает ему адрес обертки и говорит, чтобы получить его, запустить его до или после некоторых операций, первая функция будет работать там, где это необходимо, не волнуйтесь.
Эта статья была написана с целью объяснения того, что я понимаю как для себя, так и людям, которые хотят понять логику декоратора. Я надеюсь, что эта статья, в которой я объединил свои собственные слова с ресурсами, которые я исследовал в Интернете, будет полезен вам …
Оригинал: “https://dev.to/berkinozturk/decorators-in-python-p2j”