Рубрики
Без рубрики

Декораторы в Питоне

Всем привет, В этой статье я постараюсь объяснить логику декораторов, что … Помечено Python, алгоритмы, объекты, OOP.

Всем привет,

В этой статье я постараюсь объяснить логику декораторов, которая является запутанным предметом для некоторых, как я могу. Но для лучшего понимания давайте сначала посмотрим на функцию и объекты, которые удерживают их.

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”