A аналогичный вопрос был задан, но OP сравнивает оболочку с функцией без возврата, поэтому ответы сосредоточены на этой "ошибке".
Я понял декораторы и почему мы их используем вместоподклассов после прочтения этой статьи .Там они пишут следующий пример, в котором вводят необходимость в оболочке:
def uppercase_decorator(function):
def wrapper():
funct = function()
make_uppercase = funct.upper()
return make_uppercase
return wrapper
Тем не менее, я могу написать «то же самое» (я ожидаю, что вы скажете, что это не так), этоway:
def uppercase_decorator(function): #previously 'function' was called 'message' but 'function' is clearer for comparison.
make_uppercase = function().upper
return make_uppercase
Обе версии могут быть применены к этому fn, что приведет к тому же выводу ('HI ALL!') при вызове salute()
:
@uppercase_decorator
def salute():
return 'Hi all!'
Если основной fnвозвращает случайную строку (спасибо @wim за подсказку), можно заметить, что каждый раз, когда она запускается, строка без оболочки всегда возвращает одно и то же при выполнении строки sayGarbage()
:
def decorateIt(fn):
toUpper = fn().upper
return toUpper
def decorateW(fn):
def wrapper():
funct = fn()
toUpper = funct.upper()
return toUpper
return wrapper
import random, string
@decorateIt
def sayGarbage():
return "".join(random.choice(string.ascii_lowercase) for i in range(6))
sayGarbage()
Почемучто так?