zoukankan      html  css  js  c++  java
  • python之装饰器

    装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能

    装饰器语法

    (1)无参数装饰器

    [python] view plaincopy
     
    1. def deco(func):  
    2.     print func  
    3.     return func  
    4. @deco  
    5. def foo():pass  
    6. foo()  

    第一个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco函数内对传入的函数对象做一番“装饰”,然后返回这个对象(记住一定要返回 ,不然外面调用foo的地方将会无函数可用。实际上此时foo=deco(foo))

    我写了个小例子,检查函数有没有说明文档:

    [python] view plaincopy
     
    1. def deco_functionNeedDoc(func):  
    2.     if func.__doc__ == None :  
    3.         print func, "has no __doc__, it's a bad habit."  
    4.     else:  
    5.         print func, ':', func.__doc__, '.'  
    6.     return func  
    7. @deco_functionNeedDoc  
    8. def f():  
    9.     print 'f() Do something'  
    10. @deco_functionNeedDoc  
    11. def g():  
    12.     'I have a __doc__'  
    13.     print 'g() Do something'  
    14. f()  
    15. g()  

    (2)有参数装饰器

    [cpp] view plaincopy
     
    1. def decomaker(arg):  
    2.     '通常对arg会有一定的要求'  
    3.     """由于有参数的decorator函数在调用时只会使用应用时的参数  
    4.        而不接收被装饰的函数做为参数,所以必须在其内部再创建  
    5.        一个函数  
    6.     """  
    7.     def newDeco(func):    #定义一个新的decorator函数  
    8.         print func, arg  
    9.         return func  
    10.     return newDeco  
    11. @decomaker(deco_args)  
    12. def foo():pass  
    13. foo()  

    第一个函数decomaker是装饰函数,它的参数是用来加强“加强装饰”的。由于此函数并非被装饰的函数对象,所以在内部必须至少创建一个接受被装饰函数的函数,然后返回这个对象(实际上此时foo=decomaker(arg)(foo)

  • 相关阅读:
    前后端微服务联调
    Rancher搭建ES容器集群
    Rancher解决磁盘占满异常
    Rancher搭建Redis主从集群
    Rancher搭建NFS持久存储
    Linux普通用户管理
    Rancher部署mysql8
    Delegate背后的秘密
    Java——反射
    redis 操作命令
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/5006524.html
Copyright © 2011-2022 走看看