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

复制代码

  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. 80端口被占用,pid=4强制杀进程杀不掉

    解决: http://www.cnblogs.com/myjavawork/articles/1867839.html 把SqlServer的该服务关闭.虽然他显示的进程号跟搜出来的不一样.

  2. BZOJ4631 : 踩气球

    将所有盒子插入链表,每当一个盒子变空时,从链表里删去它. 查一下它的前驱后继$pre,nxt$,那么$[pre+1,nxt-1]$都是空的. 每次对于$[A,B]$这段都为空,对小朋友按$R$维护线段 ...

  3. BZOJ4231 : 回忆树

    一个长度为$|S|$的串在树上匹配有两种情况: 1.在LCA处转弯,那么这种情况只有$O(|S|)$次,暴力提取出长度为$2|S|$的链进行KMP即可. 2.不转弯,那么可以拆成两个到根路径的询问. ...

  4. 【BZOJ1426】收集邮票 期望

    [BZOJ1426]收集邮票 Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的, ...

  5. [转]crontab环境变量设置

    原文连接:http://blog.csdn.net/zc02051126/article/details/20480289 come from http://www.360doc.com/conten ...

  6. HDU 2822 (BFS+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2822 题目大意:X消耗0,.消耗1, 求起点到终点最短消耗 解题思路: 每层BFS的结点,优先级不同 ...

  7. 经验分享:多屏复杂动画CSS技巧三则

    当下CSS3应用已经相当广泛,其中重要成员之一就是CSS3动画.并且,随着CSS动画的逐渐深入与普及,更复杂与细腻的动画场景也如雨后春笋般破土而出.例如上个月做的「企业QQ-新年祝福」活动: 感谢sh ...

  8. A Simple C++ Template Class that Matches a String to a Wildcard Pattern

    A recently implemented enhanced wildcard string matcher, features of which including, Supporting wil ...

  9. TCP/IP基础知识

    TCP/IP基础知识 网络 TCP/IP 引言 本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容 TCP/IP ...

  10. ELK_日志分析系统Logstash+ElasticSearch+Kibana4

    elk 日志分析系统 Logstash+ElasticSearch+Kibana4 logstash 管理日志和事件的工具 ElasticSearch 搜索 Kibana4 功能强大的数据显示客户端 ...