zoukankan      html  css  js  c++  java
  • 个人关于python装饰器的白痴理解

    无参数装饰器

    对于python小白来说,python的装饰器简直让人懵逼,不知如何理解,其实按照装饰器的字面意思,

    就是把自己定义的函数装饰一遍,然后返回一个新的函数(注意是新的,已经不是本来定义的函数了)

    为什么这么说,我用一个装饰器最原始的例子来说明,看一下代码:

     1 #装饰函数
     2 def decorator(foo):
     3     def wrapper():
     4         print 'wrapper'
     5         return foo()
     6     return wrapper
     7 
     8 #自定义函数
     9 def abc():
    10     print 'abc'
    11 
    12 #装饰abc
    13 abc = decorator(abc)

    以上就是装饰器的过程,可以看出调用decorator函数,返回的是wrapper函数对象,而不是abc这个函数对象,

    abc这个函数在wrapper中已经是被调用了的,只是返回一个结果。以上代码的运行结果如下图,可以看出装饰

    之后的abc是wrapper的函数对象,而不是原来函数了。

    而python的语法糖'@'就是执行了以上的过程,下面的代码和上面的代码原理是一样的:

    1 def decorator(foo):
    2     def wrapper():
    3         print 'wrapper'
    4         return foo()
    5     return wrapper
    6 
    7 @decorator
    8 def abc():
    9     print 'abc'

    python的装饰器语法就是自动调用decorator函数,并以自定义的函数abc函数对象为参数,

    返回wrapper函数对象,这样一个过程。

    带参数的装饰器:

    接下来,再深一步来说说带参数的装饰器, 其实这个只比上面那个无参数装饰器多了一步,

    就是先调用装饰器函数,再返回真正的装饰器,之后的步骤和无参数的一样了,说得太抽象?

    直接上代码,这样就明显了,先调用用最外层的函数,返回的是一个真正的装饰器,然后像

    之前无参数的时候一样,修饰abc函数后返回新的函数对象。

     1 def decoratorFunc(arg):
     2     def decorator(foo):
     3         def wrapper():
     4             if arg == 0:
     5                 print 'lalala'
     6             return foo()
     7         return wrapper
     8     return decorator
     9 
    10 deco0 = decoratorFunc(0)
    11 deco1 = decoratorFunc(1)
    12 
    13 abc0 = deco0(abc)
    14 abc1 = deco1(abc)

    然后python的语法糖的过程也是像上面那样了,所以我得出一个结论,就是@后面一定是一个

    函数对象,而非函数调用!

    1 @decoratorFunc(0)
    2 def abc():
    3     print 'abc'

    最后

    写更普通的装饰器,如果被装饰的函数有参数怎么办?很简单,利用python的可变长度参数就行。

    注意,是在wrapper这个函数上我们写上python的可变长度参数,而装饰器函数decorator的参数

    永远只有一个,就是函数对象。看以下代码,是无参数装饰器的例子,如果是带参数的函数,也只

    需要把wrapper改成接收可变长度参数就行。

     1 def decorator(foo):
     2     def wrapper(*args, **kwargs):
     3         print 'wrapper'
     4         return foo(*args, **kwargs)
     5     retrun wrapper
     6 
     7 
     8 @decorator
     9 def abc(arg):
    10     print 'abc:', arg

    作者:陈栋权

    时间:2016/09/05

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,

    且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    如有特别用途,请与我联系邮箱:kingchen.gd@foxmail.com

    最后有兴趣的同学可以关注我的微信公众号,可以随时及时方便看我的文章。*^_^*

    扫码关注或者搜索微信号:King_diary 

  • 相关阅读:
    pikachu——Unsafe Filedownload Fileupload(不安全的文件下载和上传)
    pikachu——Files Inclusion(文件包含漏洞)
    pikachu——RCE
    pikachu——SQL注入
    pikachu——XSS(跨网站脚本漏洞)
    pikachu——CSRF
    pikachu——暴力破解
    GCD 信号量 dispatch_semaphore_t
    【转】iOS 9 Storyboard 教程(一上)
    一个大小为N的数组,里面是N个整数,怎样去除重复的数
  • 原文地址:https://www.cnblogs.com/king-ding/p/pydecorator.html
Copyright © 2011-2022 走看看