1、被装饰的函数有参数(一个参数):

  1. def w1(func):
  2. def inner(arg):
  3. # 验证1
  4. # 验证2
  5. # 验证3
  6. return func(arg)
  7. return inner
  8.  
  9. @w1
  10. def f1(arg):
  11. printf1

2、被装饰的函数有参数(两个参数):

  1. def w1(func):
  2. def inner(arg1,arg2):
  3. # 验证1
  4. # 验证2
  5. # 验证3
  6. return func(arg1,arg2)
  7. return inner
  8.  
  9. @w1
  10. def f1(arg1,arg2):
    printf1
  1.  
  1.  

3、被装饰的函数有参数(三个参数):

  1. def w1(func):
  2. def inner(arg1,arg2,arg3):
  3. # 验证1
  4. # 验证2
  5. # 验证3
  6. return func(arg1,arg2,arg3)
  7. return inner
  8.  
  9. @w1
  10. def f1(arg1,arg2,arg3):
  11. printf1

4、装饰具有处理n个参数的函数的装饰器:

  1. def w1(func):
  2. def inner(*args, **kwargs):
  3. # 验证1
  4. # 验证2
  5. # 验证3
  6. return func(*args, **kwargs)
  7.  
  8. return inner
  9.  
  10. @w1
  11. def f1(arg1, arg2, arg3):
  12. print(f1)

5、一个函数可以被多个装饰器装饰:

  1. def w2(func):
  2. def inner(*args, **kwargs):
  3. # 验证1
  4. # 验证2
  5. # 验证3
  6. return func(*args, **kwargs)
  7.  
  8. return inner
  9.  
  10. @w1
  11. @w2
  12. def f1(arg1, arg2, arg3):
  13. print(f1)

6、更牛逼的装饰器:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. def Before(request, kargs):
  5. print('before')
  6.  
  7. def After(request, kargs):
  8. print('after')
  9.  
  10. def Filter(before_func, after_func):
  11. def outer(main_func):
  12. def wrapper(request, kargs):
  13.  
  14. before_result = before_func(request, kargs)
  15. if (before_result != None):
  16. return before_result;
  17.  
  18. main_result = main_func(request, kargs)
  19. if (main_result != None):
  20. return main_result;
  21.  
  22. after_result = after_func(request, kargs)
  23. if (after_result != None):
  24. return after_result;
  25.  
  26. return wrapper
  27.  
  28. return outer
  29.  
  30. @Filter(Before, After)
  31. def Index(request, kargs):
  32. print('index')

7、functools.wraps

上述的装饰器虽然已经完成了其应有的功能,即:装饰器内的函数代指了原函数,注意其只是代指而非相等,原函数的元信息没有被赋值到装饰器函数内部。例如:函数的注释信息

  1. def outer(func):
  2. def inner(*args, **kwargs):
  3. print(inner.__doc__) # None
  4. return func()
  5. return inner
  6.  
  7. @outer
  8. def function():
  9. """
  10. asdfasd
  11. :return:
  12. """
  13. print('func')

如果使用@functools.wraps装饰装饰器内的函数,那么就会代指元信息和函数。

  1. def outer(func):
  2. @functools.wraps(func)
  3. def inner(*args, **kwargs):
  4. print(inner.__doc__) # None
  5. return func()
  6. return inner
  7.  
  8. @outer
  9. def function():
  10. """
  11. asdfasd
  12. :return:
  13. """
  14. print('func')

python杂记-5(装饰器)的更多相关文章

  1. python高级之装饰器

    python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...

  2. [python基础]关于装饰器

    在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...

  3. python笔记 - day4-之装饰器

                 python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...

  4. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...

  5. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  6. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  7. 第二篇:python高级之装饰器

    python高级之装饰器   python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...

  8. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  9. Python进阶之装饰器

    函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...

随机推荐

  1. Lnmp下安装memcached

            Lnmp下安装memcached 1.先安装 libevent,再安装 Memcached主程序 # tar xf libevent-2.0.21-stable.tar.gz # cd ...

  2. Oracle10GODP连接11G数据库,出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题

    一.出现症状 1.使用sqlplus连接正常 2.C#使用10g的ODP.NET连接时,报上面的错误 二.原因 1.Oracle11G之前密码是不区分大小写的,从11G开始默认密码区分大小写 2.使用 ...

  3. Windows重新建立图标缓存

    有的时候,快捷方式的图标会因各种优化软件而变得面目全非,这时就需要重新建立图标缓存 新建一个文本文档,把文件的后缀名修改成.bat 的例如 icon.bat 在里面填写下面的内容: rem 关闭exp ...

  4. 浅议tomcat与classloader

    关于tomcat和classloader的文章,网上多如牛毛,且互相转载,所以大多数搜到的基本上是讲到了tomcat中classloader的几个层次,对于初接触classloader,看了之后还是只 ...

  5. Python中的内置函数

    2.1 Built-in Functions The Python interpreter has a number of functions built into it that are alway ...

  6. FreeBSD 路由详解

    在同一个局域网上的计算机是直接连通的,但是不同的网络上的计算机并没有直接相连,只能通过一台特殊的专用计算机 -路由器来完成连通.路由器连接有多个网络界面,每一个网络界面连接到一个相应的网络上,具有一个 ...

  7. linq to sql 增删改查

    ORM<Object Relation Mapping> Linq To Sql: 一.建立Linq To Sql 类 : 理解上下文类: Linq To Sql 类名+context 利 ...

  8. 初识 Asp.Net内置对象之Application对象

    Application对象 Applocation对象用于共享应用程序级信息,即多个用户可以共享一个Applocation对象. 用户在请求Asp.Net文件时,将启动应用程序并且创建Applicat ...

  9. Android之开源项目工具库篇

    本文转自:http://www.trinea.cn/android/android-open-source-projects-dev-lib/ 本文中你可以找到那些精美App中各种有特性的View,如 ...

  10. OC7_代理的基本概念

    // // Cat.h // OC7_代理的基本概念 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhangxue ...