有两个装饰器,第一个没有附加函数;它立即将我们添加附加功能的函数和同一函数的参数作为参数:
def test(*args): #Наша функция, тест, которая будет принимать произвольное количество параметров.
print(*args)
def call_start_end(func, *args):
print('Начало теста')
func(*args)
print('Конец теста')
call_start_end(test, 'Тестируем', 'Ещё не закончили', '...')
# Вывод :
# Начало теста
# Тестируем, Ещё не закончили, ...
# Конец теста
第二个装饰器已经使用了一个附加函数来包装包装器:
def test(*args):
print(*args)
def prewrapper(func): #Обёртка для обёртки, которая принимает функцию.
def call_start_end(*args): # Сама обёртка, которая принимает аргументы для функции, функционал которой мы расширяем.
print('Начало теста')
func(*args)
print('Конец теста')
return call_start_end
prewrapper(test)('Тестируем', 'Ещё не закончили', '...')
# Вывод:
# Начало теста
# Тестируем Ещё не закончили ...
# Конец теста
因此,如果您解释为什么我们应该用另一个包装器来包装包装器,我们将函数单独传递到其中,而不是像装饰器的第一个示例中那样,不将它们传递到一个包装器中,我将不胜感激?在我看来,正是因为此时此刻,装饰器在一定程度上难以理解;目前还不清楚为什么它们需要另外包装在另一个包装器中。预先感谢您的回答。
答案很简单 - 不是“手动”使用这些装饰器,而是精确地作为装饰器 - 通过
@使用此装饰器通过某些函数来装饰它们。错误!
一切都按预期进行。
通过使用装饰器时,
@您可以将参数和函数传递给装饰器,但只能分别传递:装饰器 - 函数,函数本身 - 参数。没有一个电话可以一次性传达所有内容。如果您希望装饰器本身有一些可以传递给它本身的参数,那么您将必须编写两个完整的包装器:这就是为什么一切看起来如此复杂,但如果你仔细观察,一切都非常合乎逻辑,并且很清楚为什么一切都会这样做。
一般来说,装饰器的要点是你不以任何方式更改主代码,你仍然调用你的函数,就好像什么都没有改变一样:
您只需向函数描述添加某个修饰符,从而根据需要更改其行为,为其添加一些功能。这非常方便 - 您有一个更改点,与函数本身的描述位于同一位置。你甚至可以依次将多个装饰器应用到一个函数上,这看起来非常合乎逻辑且易于理解。