- 语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。
通常来说,使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
- 装饰器:装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或者可调用对象。
- 装饰器只是语法糖,装饰器可以像常规的可调用对象那样调用,其参数是另一个函数,只是装饰器更加方便。尤其是在做元编程(运行时改变程序行为)时。
通俗理解
- 自己看了书上的解释和网上的示例,了解了一些关于装饰器的含义及其用法,下面结合自己的理解通俗的说一下装饰器的作用,如有错误还请多多批评指正。
不论是在python中,还是在C语言中,都可以将函数f1()
作为参数,传递到另一个函数f2()
中,函数f2()
就可以调用f1()
函数的功能。
这应该很好看懂,就是将func1作为参数传到func2中,在func2中可以使用func1中的功能。
其实现在我们已经实现了一个装饰器,就是func2装饰func1,再通俗点就是说,我们可以在func1执行前后,做一些我们想要的操作,这些操作就写在func2中,比如我们想在func1执行前后各输出一句"Hello, World!"。如下
这样,我们就对装饰器有了一个基本的了解。在python中,装饰器还有一种更简便的写法:
@func2
func1()
表示fun2装饰func1(上边的装饰下边的),那么上述的例子就可以写成:
这种方法也叫语法糖,就是不改变函数功能的情况下,使用另一种更加简易编写方式,减少代码量。
拓展
以上就是装饰器最基本的用法,我们还可以借助return返回值,将被装饰函数修改为另一个函数,如下:
这样,我们就利用装饰器,将函数func2的功能进行了修改。
从上述运行结果我们也可以推断一整套流程的执行过程:
执行func2(),将func2作为参数,执行函数func1(),函数func1()执行完,返回值赋给func2,此时的返回值并不是一个值,而是一个函数(func3),执行这个函数,得到结果。
最后我们通过func2
可以看到,func2变成了func3()函数的引用,成功的修改了函数的功能。
装饰器还有一个特点,就是它们在被装饰的函数定义之后立即运行。在文件中就是导包之后就执行。如下:
# 新建py文件decorate.py
registry = []
def register(func):
print('running register(%s) function' % func)
registry.append(func)
return func
@register
def f1():
print('running f1()')
@register
def f2():
print('running f2()')
@register
def f3():
print('running f3()')
def main():
print('running main()')
print('registry -> ', registry)
f1()
f2()
f3()
if __name__=="__main__":
main()
# 新建文件decorate2.py
import decorate
运行decorate2.py,如下
可以看到,只要导包之后,就会运行装饰器。
以上就是python中装饰器的一些知识。