为什么需要装饰器?
谁看过关于装饰器的经典解释:
# Декоратор - это функция, ожидающая ДРУГУЮ функцию в качестве параметра
def my_shiny_new_decorator(a_function_to_decorate):
# Внутри себя декоратор определяет функцию-"обёртку".
# Она будет (что бы вы думали?..) обёрнута вокруг декорируемой,
# получая возможность исполнять произвольный код до и после неё.
def the_wrapper_around_the_original_function():
# Поместим здесь код, который мы хотим запускать ДО вызова
# оригинальной функции
print "Я - код, который отработает до вызова функции"
# ВЫЗОВЕМ саму декорируемую функцию
a_function_to_decorate()
# А здесь поместим код, который мы хотим запускать ПОСЛЕ вызова
# оригинальной функции
print "А я - код, срабатывающий после"
# На данный момент функция "a_function_to_decorate" НЕ ВЫЗЫВАЛАСЬ НИ РАЗУ
# Теперь, вернём функцию-обёртку, которая содержит в себе
# декорируемую функцию, и код, который необходимо выполнить до и после.
# Всё просто!
return the_wrapper_around_the_original_function
# Представим теперь, что у нас есть функция, которую мы не планируем больше трогать.
def a_stand_alone_function():
print "Я простая одинокая функция, ты ведь не посмеешь меня изменять?.."
a_stand_alone_function()
# выведет: Я простая одинокая функция, ты ведь не посмеешь меня изменять?..
# Однако, чтобы изменить её поведение, мы можем декорировать её, то есть
# Просто передать декоратору, который обернет исходную функцию в любой код,
# который нам потребуется, и вернёт новую, готовую к использованию функцию:
a_stand_alone_function_decorated = my_shiny_new_decorator(a_stand_alone_function)
a_stand_alone_function_decorated()
#выведет:
# Я - код, который отработает до вызова функции
# Я простая одинокая функция, ты ведь не посмеешь меня изменять?..
# А я - код, срабатывающий после
接下来是一段话:
可能现在我们希望每次调用 a_stand_alone_function 时,调用 a_stand_alone_function_decorated。没有什么比这更简单的了,只需用 my_shiny_new_decorator 返回给我们的函数覆盖 a_stand_alone_function 即可:
a_stand_alone_function = my_shiny_new_decorator(a_stand_alone_function)
a_stand_alone_function()
#выведет:
# Я - код, который отработает до вызова функции
# Я простая одинокая функция, ты ведь не посмеешь меня изменять?..
# А я - код, срабатывающий после
那些。在这段之后 - 我们失去了以原始形式调用函数的机会。现在它总是装饰。
问题是,为什么那时需要装饰器?
1)为什么不(如果我们无论如何都失去了原来的功能)只是重写原来的功能?(只需在函数的开头和结尾添加我们需要的代码片段)。像这样:
def a_stand_alone_function():
print "Я - код, который отработает до вызова функции"
print "Я простая одинокая функция, ты ведь не посмеешь меня изменять?.."
print "А я - код, срабатывающий после"
或者,如果附加代码很大并且应该单独保存,那么:
def a_stand_alone_function():
pre_function()
print "Я простая одинокая функция, ты ведь не посмеешь меня изменять?.."
post_function()
2)为什么所有这些混乱,而不是像问题 1 那样提出一个简单的解决方案?
3)如果可以同时调用装饰函数和原始函数,我也会理解装饰器。但是用@写的装饰器不允许这样。为什么装饰器会覆盖原来的功能?
我将非常感谢您提供解释的答案,也许还有来自实际实践的清晰示例。
