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

复制代码

  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 progressbar

    cc.Class({ extends: cc.Component, properties: { progressBar: { default:null, type:cc.ProgressBar }, ...

  2. Hadoop执行作业时报错:java.lang.OutOfMemoryError: Java heap space

    常常被一些用户问到,说“为什么我的mapreduce作业总是运行到某个阶段就报出如下错误,然后失败呢?以前同一个作业没出现过的呀?” 10/01/10 12:48:01 INFO mapred.Job ...

  3. hdu1272 小希的迷宫

    Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...

  4. Loadrunner脚本录制常见问题整理

    1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开Inter ...

  5. [WP8.1UI控件编程]Windows Phone XAML页面的编译

    1.1.2 XAML页面的编译 Windows Phone的应用程序项目会通过Visual Studio完成XAML页面的编译,在程序运行时会通过直接链接操作加载和解析XAML,将XAML和过程式代码 ...

  6. 如何在电脑上测试手机网站(补充)和phonegap

    颜海镜 介绍了专业人士精准测试手机网站的经验 http://www.cnblogs.com/yanhaijing/p/3557261.html, 因为太专业了,稍显复杂和琐碎,这里我介绍下我一直关注的 ...

  7. NOI题库 1768最大子矩阵 题解

    NOI题库 1768最大子矩阵  题解     总时间限制: 1000ms 内存限制: 65536kB   描述   已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...

  8. qt编译常见错误

    一.fatal error: QWidget: 没有那个文件或目录 类似于找不到文件目录的,在.pro文件中添加 QT +=\ widgets 类似就可以编译通过

  9. Redis_Jedis使用总结

    目录:1.pipeline2.跨jvm的id生成器3.跨jvm的锁实现(watch multi)4.redis分布式 1. Pipeline 官方的说明是:starts a pipeline,whic ...

  10. python 之redis

    redis是一个key-value存储系统,与memcached类似,它支持存储到value类型相对更多,包括string(字符串),list(列表),set(集合),zset(sorted set ...