Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357171
  • 博文数量: 94
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 606
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-30 08:58
个人简介

x

文章分类

全部博文(94)

文章存档

2019年(4)

2018年(10)

2017年(26)

2016年(38)

2015年(16)

我的朋友

分类: Python/Ruby

2018-05-14 17:06:46


点击(此处)折叠或打开

  1. 参考
  2.     1.雪峰函数式编程之装饰器
  3.     2.https://blog.csdn.net/Sean_ran/article/details/52097997

  4. 概念:现在我们知道装饰器实际上就是一个函数,我们也知道他们接受函数对象,但他们是怎么处理那些函数?当你包装一个函数的时候,你最终会调用它,最棒的是我们能够在包装的环境下在合适的时机调用它,我们在执行函数之前,可以运行那些预备代码,如 post-morren分析,也可以在执行代码之后做个清理工作,所以当你看见一个装饰器函数的时候,很可能在里面找到这样一些代码,它定义了某个函数并在定义内的某处嵌入了对目标函数的调用或者至少一些引用。从本质上看,这些特征引入了java开发者称之为AOP的概念,可以考虑在装饰器中置入通用功能的代码来降低程序复杂度。
  5.     
  6. 用处:
  7.     @引入日志
  8.     @增加计时逻辑来检测性能
  9.     @给函数加入事物能力

  10. 1、不带参数的装饰器和不带参数的增强函数(被装饰的函数)

  11. def decorator_1(func):
  12.     def wrapper(*args, **kw):
  13.         print('call %s():' % func.__name__)
  14.         return func(*args, **kw)
  15.     return wrapper
  16.     

  17. @decorator_1
  18. def function_1():
  19.     print('hello world')
  20.     
  21. function_1() 相当于
  22.     1.f = decorator_1(function_1)          # wrapper()函数对象
  23.     2.f()                                  # 执行wrapper()函数
  24.     
  25. 2、带参数的装饰器和不带参数的增强函数(被装饰的函数)
  26.     
  27. def decorator_2(params):
  28.     def decorator(func):
  29.         def wrapper(*args, **kw):
  30.             print('call %s():' % func.__name__)
  31.             return func(*args, **kw)
  32.         return wrapper
  33.     return decorator
  34.     
  35. @decorator_2('decorator params')
  36. def function_2():
  37.     print('hello world')
  38.     
  39. function_2() 相当于
  40.     1.f1 = decorator_2('decorator params')   # decorator()函数对象
  41.     2.f2 = f1(function_2)                    # wrapper()函数对象
  42.     3.f2()                                   # 执行wrapper()函数

  43. 3、不带参数的修饰器和带参数的增强函数(被装饰的函数)

  44. def decorator_3(func):
  45.     def wrapper(*args, **kw):
  46.         print('call %s():' % func.__name__)
  47.         return func(*args, **kw)
  48.     return wrapper
  49.     
  50. @decorator_3()
  51. def function_3(*args, **kw):
  52.     print('function_3: ', 'args: ', args, 'kw: ', kw)
  53.     
  54. function_3() 相当于
  55.     1.args, kw = [1, 2, 3], {'a': 'first', 'b': 'second', 'c': 'third'}
  56.     2.f1decorator_3(function_3        # wrapper()函数对象
  57.     3.f1(*args, **kw)                      # 执行wrapper()函数
  58.         
  59. 4、带参数的修饰器和带参数的增强函数(被装饰的函数)

  60. def decorator_4(params):
  61.     def decorator(func):
  62.         def wrapper(*args, **kw):
  63.             print('call %s():' % func.__name__)
  64.             return func(*args, **kw)
  65.         return wrapper
  66.     return decorator

  67. @decorator_4('decorator params')
  68. def function_4():
  69.     print('function_4: ', 'args: ', args, 'kw: ', kw)
  70.     
  71. function_4() 相当于:
  72.     1.args, kw = [1, 2, 3], {'a': 'first', 'b': 'second', 'c': 'third'}
  73.     2.f1 = decorator_4('decorator params')  decorator()函数对象
  74.     3.f2 = f1(function_4)                   # wrapper()函数对象
  75.     4.f2(*args, **kw)                       # 执行wrapper()函数

  76. 5、利用staticmethod内建函数将函数转化为静态方法

  77. class TestClass(object):
  78.     @staticmethod
  79.     def static_foo():
  80.     ...

  81. 6、多修饰器
  82.     @g
  83.     @f
  84.     def foo():
  85.     ...
  86.     
  87.     调foo() 相当于:foo = g(f(foo)), foo()
  88.     --------------------------------------------------------------------
  89.     @g(params)
  90.     @f
  91.     def foo(): 
  92.         pass
  93.     ...
  94.     调用foo() 相当于:foo = g(params)(f(foo)), foo()
  95.     --------------------------------------------------------------------
  96.     @g(params1)
  97.     @f(params2)
  98.     def foo():
  99.         pass
  100.     ...
  101.     调用foo() 相当于:foo = g(params1)(f(params2)(foo))foo()
  102.     --------------------------------------------------------------------
  103.     @g(params1)
  104.     @f(params2)
  105.     def foo(*args, **kw):
  106.         pass
  107.     ...
  108.     调用foo() 相当于:foo = g(params1)(f(params2)(foo)), foo(*args, **kw)


阅读(1465) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~