Скажем, вы работаете на большой банк.
Ваш хакер коллега реализовал волшебную функцию, которая использует SSH, чтобы войти в основной сервер банка (написанный в COBOL, который вы вообще не знаете), анализируют использование ЦП за последние 24 часа и возвращает результат в виде загадочного строка. Отказ
Ваш босс просит вас изменить волшебную функцию, чтобы она возвращала целочисленное значение, которое легче обрабатывать. Другими словами, ваше вторичное банковское приложение (написанное в Python) ожидает, что теперь каждый звонок Magic_function
приводит к целочисленной цене.
Конечно, вы можете перейти в код Magic_Function и переписать его …
… Но вы бы не рискуете ломать приложение и потерять миллионы долларов, не могли бы вы? Тем не менее, вы должны коснуться его, потому что существующие функции вне вашего управления уже вызывают Magic_function
!
Решение простое: используйте функцию обертки и назначьте ее названию Magic_function
! Вот как вы достигли этого:
def integer_decorator(func): ''' Returns a function that converts the output of func to an integer. ''' def wrapper(): output = func() s = 0 for x in output.split("+"): s += int(x) return s return wrapper # This function is written by your hacker colleague. # You don't want to touch it! def magic_function(): # ... complex stuff happening here ... return "89898292211+1123+13" magic_function = integer_decorator(magic_function) # ... somewhere in the code... print(magic_function()) # 89898293347
Как видите, вы не трогаете Magic_function
Но его поведение все еще изменилось! Для этого вы сначала создаете функцию integer_decorator
который принимает функцию аргумента Func
и возвращает функцию обертки, которая преобразует вывод строки в целое число.
Затем мы назначаем эту функцию обертки на имя Magic_function
И, таким образом, измените поведение Magic_function
Когда он используется в коде. Это происходит в линии magic_function (magic_function)
Отказ
Декоратор просто возвращает новый объект функции, который «украшает» (или изменяет) существующую функцию, которая передается как аргумент. В нашем случае Integer_Decorator возвращает модифицированный Magic_function
Отказ
Есть какой-то синтаксический сахар того, как вы можете достичь то же самое немного легче. Линия magic_function (magic_function)
Модифицирует поведение Magic_function
Отказ То же самое можно достичь, когда «украшать» Magic_function
используя @
ключевое слово:
@integer_decorator def magic_function(): # ... complex stuff happening here ... return "89898292211+1123+13" # ... somewhere in the code... print(magic_function()) # 89898293347
Таким образом, вы можете легко обогатить любую функцию с дополнительными функциями, используя @
ключевое слово.
Куда пойти отсюда?
Эксперты Python сегодня зарабатывают шестифункциональные зарплаты или больше. Стать кодер Python – это выгодный выбор жизни с огромными преимуществами для вас и вашей семьи!
Как вы становитесь экспертом? Просто: Читать дальше Кодирование Книги, чем ваши коллеги! Хотя ваши коллеги будут прочитать только одну книгу кодирования в год (MAX), вы можете прочитать одну книгу в неделю, чтобы получить 52x преимущество перед большинством кодеров.
Купить пакет “Coffee Break Python” сейчас!
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.