什么是装饰器?
Python装饰器就是用来拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。这个函数的特殊之处在于它的返回值也是一个函数,这个函数内嵌原函数。一般情况下,我们要拓展原来函数代码,最直接的方法就是在原来代码里面修改,比如:def hello(): print(“hello world”)
这是我们最早一个函数,就是打印一个hello world。然后我们如果想打印一个我是扶程星云hello world 的话,怎么办?def hello(): print(“hello world”) print(“我是扶程星云”)
但是实际工作中,很多时候核心代码是大家公用的,不能你加点东西我加点东西。def hello(): print("hello world")def speak(): hello()s = speaks()
这种方法会导致很多新的函数名,调用的时候还要根据情况调用不同的函数。有没有更好的方法呢?让我们继续,以下是一个简单的装饰器函数。def speak(func): def sayName(): print("我是扶程星云") return func return sayName()def sayHello(): print("hello world") s = speak(sayHello)s()
美中不足,每次给hello函数增加功能都要用到类似s=speak(sayHello)的调用方法。Python为了简化这种情况,提供了一个语法糖”@”。语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。def speak(func): def sayName(): print("我是扶程星云") return func return sayName()@speakdef sayHello(): print("hello world")sayHello()
大家可以看到,在给sayHello()函数装上speak()函数后,sayHello函数首先执行speak函数里面的sayName,再执行原sayHello函数。就像孙悟空的眼睛,但是在太上老君的八卦炉里,给装上了火眼金睛功能,平时孙悟空看东西就是和普通猴子一样,看啥是啥,一旦启用火眼金睛功能,同样是看,还能看出妖精来。这就是装饰器的功能,如果读者还有不懂的地方,请在网络上查找更多资料。