首先,什么是函数修饰符?函数修饰符就是对原有函数做一层包装。比如有以下两个函数:

复制代码

  1. def func1():
  2. print 'I am function func1'
  3. def func2():
  4. print 'I am function func2'

现在我们想为这两个函数增加一段共同的操作,这时就可以使用函数修饰符。首先我们定义一个修饰函数,先不做任何处理,仅仅打印一条横线:

复制代码

  1. def de( f )
  2. def call_():
  3.         print '-------------------------------'
  4.         return f()
  5.     return _call_

使用这个修饰符:

复制代码

  1. def de( f ):
  2. def _call_():
  3. print '-------------------------------'
  4. return f()
  5. return _call
  6. @de
  7. def func1():
  8. print 'I am function func1'
  9. @de
  10. def func2():
  11. print 'I am function func2'
  12. if name = '__main__':
  13.     func1()
  14.     func2()

运行结果为:

复制代码

  1. d:\我的文档\桌面>b.py
  2. -------------------------------
  3. I am function func1
  4. -------------------------------
  5. I am function func2
  6. d:\我的文档\桌面>

可以看到,修饰符起作用了。

注意: 
1.修饰符等价于包装调用:

  1. @de
  2. def func1:
  3. ----- 等价于 ------
  4. func1 = de( func1 )

2.修饰函数必须返回一个“可调用对象”:

  1. def de( f ):
  2. def call_():
  3.         return f()
  4.     return _call # 返回的是一个函数体,而非调用_call_()

下一个问题:如果各个被修饰函数有不同的参数,怎么处理呢?例如:

  1. def func1( lst1, lst2 ):
  2. # 合并两个list,并打印各项
  3. for item in lst1+lst2:
  4. print item
  5. def func2( dic ):
  6. # 循环dict,打印各key-value
  7. for k, v in dic.items():
  8. print k, v

这两个函数参数不同,又都没有异常处理,现在我们想增加上,使用修饰符这样处理:

  1. import sys
  2. import traceback
  3. def de( f ):
  4. def call_( *args, **kwargs ):
  5.         try:
  6.             return f( *args , **kwargs )
  7.         except:
  8.             print 'param type error'
  9.     return _call
  10. @de
  11. def func1( lst1, lst2 ):
  12. for item in lst1+lst2:
  13. print item
  14. @de
  15. def func2( dic ):
  16. for k, v in dic.items():
  17. print k, v
  18. if name = '__main__':
  19. func1( [1,2], [3,4] )
  20. func2( [1,2] )

这里使用了可变参数*args和**kwargs,这样会把所有接收来的参数,原样不动的再转给原函数,是惯用法。 
以上程序运行结果: 
复制代码

    1. d:\我的文档\桌面>b.py
    2. 1
    3. 2
    4. 3
    5. 4
    6. param type error
    7. d:\我的文档\桌面>

Python中的函数修饰符@的更多相关文章

  1. Python 函数修饰符(装饰器)的使用

     Python 函数修饰符(装饰器)的使用 1.  修饰符的来源修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 修饰符是解决这类问题的绝佳设计, ...

  2. Python中readline()函数 去除换行符

    从Python中readline()函数读取的一行内容中含有换行符\n,很多时候我们需要处理不含有换行符的字符串,此时就要去掉换行符\n. 方法是使用strip()函数. 例子如下: f = open ...

  3. python函数修饰符@的使用

    python函数修饰符@的作用是为现有函数增加额外的功能,常用于插入日志.性能测试.事务处理等等. 创建函数修饰符的规则:(1)修饰符是一个函数(2)修饰符取被修饰函数为参数(3)修饰符返回一个新函数 ...

  4. flask 文件下载 文件服务器 请求参数 函数修饰符

    180M电子书 通过已经下载到pc,在上传到私有公网服务器,之后,再异地下载 以下代码,文件内容错乱 [root@bigdata-server- mydataweb]# tree . ├── mydl ...

  5. C# 中的sealed修饰符学习

    转载原地址 http://developer.51cto.com/art/200908/147327.htm C#语言还是比较常见的东西,这里我们主要介绍C# sealed修饰符,包括介绍两个修饰符在 ...

  6. Java学习笔记十九:Java中的访问控制修饰符

    Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...

  7. 20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)

    1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. ...

  8. solidity 学习笔记(3) 函数修饰符/继承

    修饰符: 函数修饰符有 constant  view pure 其中 constant和view的功能是一样的  不会消耗gas 也就是说不会做任何存储   constant在5.0以后的版本中被废弃 ...

  9. java中4种修饰符访问权限的区别及详解全过程

    java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...

随机推荐

  1. ccc 播放动画

    cc.Class({ extends: cc.Component, properties: { anim:cc.Animation, }, // use this for initialization ...

  2. Node.js学习

    1. 下载 网址:https://nodejs.org/download/ 2. 添加express框架 如下图,运行Node.js command prompt 在命令行中输入:npm instal ...

  3. Leetcode Add Binary

    Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...

  4. ACM: 限时训练题解- Travelling Salesman-最小生成树

    Travelling Salesman   After leaving Yemen, Bahosain now works as a salesman in Jordan. He spends mos ...

  5. Codeforce - Street Lamps

    Bahosain is walking in a street of N blocks. Each block is either empty or has one lamp. If there is ...

  6. 【BZOJ】1110: [POI2007]砝码Odw

    题意 给定\(n\)个砝码和\(m(1 \le n, m \le 100000)\)个背包\((1 \le n_i, m_i \le 1000000000)\),保证对于任意两个砝码都有一个是另一个的 ...

  7. 开篇&TexturePacker打出图集给UGUI使用

    开篇: 前段时间,网上流出了一套手游源码,本想着把服务器端搭一下,给自己认识小伙伴们调试着把这套源码学习一下.于是就买一个阿里云服务器,可是花了几天时间,就是run不起来了啊.还好网上已经有人搭出来了 ...

  8. C程序演示产生僵死进程的过程

    先抄录网上一段对僵死进程的描述: 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中.这种 ...

  9. CF #374 (Div. 2) C. Journey dp

    1.CF #374 (Div. 2)    C.  Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径 ...

  10. Spring整合Hibernate之AnnotationSessionFactoryBean与LocalSessionFactoryBean

    spring集成hibernate由两种形式 1.继续使用Hibernate的映射文件*.hbm.xml 2.使用jpa形式的pojo对象, 去掉*.hbm.xml文件 一.继续使用Hibernate ...