让我们最终编写自己的装饰器｡
请记住, 装饰师会使我们的功能更加强大｡
它只是一个函数, 它包装了另一个函数, 并对其进行了增强或更改｡
但对我来说, 解释它是什么的最好方法是实际编写我们自己的代码｡
那就这么办吧｡
让我们定义一个my｡
装饰器, 这个装饰器会马上接受一个函数.
我们应该知道这是一个高阶函数｡
在这里, 我们要调用这个函数｡
但在此之前, 我们要把这个函数包装到另一个函数中｡
所以我们要定义wrap函数｡
这只是一个包装器和这个包装函数｡
将是一个简单地运行这个放克的函数｡
最后, 我们将返回wrap函数｡
注意这里我不是调用它, 我只是把它返回给别人, 以便以后有人能用它｡
好吧, 我会的
现在, 假设我们有一个简单的函数｡
你好, 我是
这个简单的函数只是打印｡
你好, 我是
多没用的功能啊｡
现在就去
为什么这是有用的？
因为现在我可以用这个作为装饰器python｡
只要我们在前面写一个A, 它就会说, 嘿, 这是一个装饰者和装饰者｡
只要我们遵循这个语法, 接受一个函数, 拥有一个包装函数, 调用函数,
返回包装函数都可以使用｡
所以如果我做我的装饰师看到它是如何全部蓝色｡
现在, 这个装饰器实际上可以在定义函数时在顶部使用｡
所以如果我们想在hello函数上使用装饰器, 我们这样使用它, 这样当我在我的程序中调用hello的时候｡
我单击“运行”｡
我明白了｡
你好吗？
好吧, 我会的
我知道你在想什么
你觉得这完全是浪费时间, 安德烈
我为什么要做这些？
我本可以这么做的｡
只需定义｡
你好, 我是
就这样｡
我很困惑｡
是这样的
就像我们刚刚对装修工做的那样｡
什么都没改变｡
它完全按照预期工作｡
但它允许我们做的是, 现在我们可以添加额外的功能｡
还记得我说过装饰器是一个函数, 就像我的装饰器一样, 它包装了另一个函数, 也就是我们传递给它的函数｡
并增强它｡
那么, 我们如何才能增强呢？
你好吗？
我们可以在这个被包装的函数中做任何事情｡
例如, 我可以说打印, 然后我们在这里打印一些星星, 或者打印｡
另一组星星在这里, 这样当我叫运行｡
轰｡
我们刚刚把我们的｡
你好, 我是
功能｡
这很酷吧？
这就是为什么装饰器是有用的, 只要添加这一行｡
我可以超级增强一个函数, 比如说我创建了另一个函数.
-再见—再见
这一笔交易即将付印｡
回头见｡
通过在此处调用并单击“运行”｡
什么都没变｡
但如果我想超级提升它, 就像｡
你好, 我是
所有我需要做的只是复制装饰和使用它在这里以及｡
所以如果我跑了｡
我们走吧｡
我们已经大大提高了购买量｡
这就是装饰师的力量｡
通过使用此语法, 我可以为其他函数添加额外的功能｡
现在我知道你在想什么了｡
我知道我也经常这么说｡
就像我能读心术一样, 但是｡
你认为这是一个很大的魔术｡
Python解释器是如何做到这一切的？
看样子｡
魔术, 对吧？
在引擎盖下面｡
它所做的一切
好吧, 让我来告诉你｡
基于我们目前所了解的函数, 因为他们是一等公民｡
好吧, 我知道了
我们所做的就是这样｡
我们说变量a｡
相等｡
你好吗？
把这个包装好, 然后和我的设计师打电话｡
我是说我的室内设计师｡
然后我就开始这样做｡
所以我们就说这是你好｡
好吧, 我只是运行它｡
就像这样｡
所以如果我运行这个｡
一切正常｡
我所做的就是包装我的hello函数｡
并将其赋给一个变量｡
所以如果我们一步一步来, 我们会看到我的装饰器接收到一个函数｡
在我们的例子中是hello函数｡
然后它返回这个包装的函数, 在这里有hello｡
所以我们返回这个wrap函数｡
所以hello to now等于这个包装函数然后这个包装函数被调用, 用什么来调用它.
它打印这个, 然后运行hello函数, 然后打印这个.
这和做这样的事情是一样的｡
我们干脆再叫一遍｡
如果我运行这个｡
这很管用｡
这看起来很奇怪, 不是吗？
但应该说得通｡
我们调用第一个函数, 第一个函数返回另一个函数, 然后我们调用下一个返回函数,
也就是wrap函数.
装饰器之所以有用, 是因为我可以在装饰器中添加, 而不需要这么做,
坦率地说, 这样看起来很混乱｡
我们的hello会被我的装饰师自动包装, 但本质上这是艺术场景正在做的事情｡
看到了吗？
没什么神奇的｡
现在就去
这是很好的, 但我打赌你仍然想知道为什么装饰是有用的｡
为了最终了解装饰器, 让我们休息一下, 我们将在下一个视频中再见｡