美文网首页Python
python中的装饰器

python中的装饰器

作者: 韩其凯 | 来源:发表于2022-01-27 12:01 被阅读0次
  • 语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。

通常来说,使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

  • 装饰器:装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或者可调用对象。
  • 装饰器只是语法糖,装饰器可以像常规的可调用对象那样调用,其参数是另一个函数,只是装饰器更加方便。尤其是在做元编程(运行时改变程序行为)时。

通俗理解

  • 自己看了书上的解释和网上的示例,了解了一些关于装饰器的含义及其用法,下面结合自己的理解通俗的说一下装饰器的作用,如有错误还请多多批评指正。

不论是在python中,还是在C语言中,都可以将函数f1()作为参数,传递到另一个函数f2()中,函数f2()就可以调用f1()函数的功能。

C++ C++运行结果 python

这应该很好看懂,就是将func1作为参数传到func2中,在func2中可以使用func1中的功能。

其实现在我们已经实现了一个装饰器,就是func2装饰func1,再通俗点就是说,我们可以在func1执行前后,做一些我们想要的操作,这些操作就写在func2中,比如我们想在func1执行前后各输出一句"Hello, World!"。如下

python2

这样,我们就对装饰器有了一个基本的了解。在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中装饰器的一些知识。

相关文章

网友评论

    本文标题:python中的装饰器

    本文链接:https://www.haomeiwen.com/subject/sccahrtx.html