Скажем, вы работаете на большой банк.
Ваш хакер коллега реализовал волшебную функцию, которая использует 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 и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.