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

复制代码

  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. CSS3 transform rotate(旋转)锯齿的解决办法

    -moz-transform: rotate(5deg);-webkit-transform: rotate(5deg); 把图片旋转了5度.本以为轻而易举,可遇到了问题.在Fireofx中显示正常, ...

  2. UVA 10892 - LCM Cardinality(数学题)

    题目链接 写写,就ok了. #include <cstdio> #include <cstring> #include <string> #include < ...

  3. C语言(2)

    C语言(2)---变量 基本格式: 变量类型  变量名1[,变量名2,变量名3,...变量名n]: 注意: 1.在C语言中如果申请一个变量,里面存放小数,则用float表示,且在输出时需要注意prin ...

  4. html5 可以讓使用者輸入url網址 ,去play影片

    <html> <head> <title>Simple Video Example</title> <script> function pl ...

  5. GO语言练习:channel 工程实例

    1.工程代码 2.编译及运行 1.工程目录结构 $ tree cgss cgss ├── cgss.go └── src ├── cg │   ├── centerclient.go │   ├── ...

  6. 地理数据库的类型geodatabase类型

    地理数据库的类型geodatabase类型 地理数据库是用于保存数据集集合的“容器”.有以下三种类型: 文件地理数据库 - 在文件系统中以文件夹形式存储.每个数据集都以文件形式保存,该文件大小最多可扩 ...

  7. VS开发好用的扩展

    VS开发好用的扩展(转) 转自:http://www.haogongju.net/art/1977373 首先为大家介绍一下开发字体,做程序开发,代码可读性,在侧面也能帮助开发提高效率,所以给大家介绍 ...

  8. C#面向对象之属性

    1.属性的定义及使用 class MyClass { ; //属性的定义 private string name = ""; //属性的定义 public int Id { get ...

  9. JAVA给图片加上水印

    import java.awt.Color;       import java.awt.Font;       import java.awt.Graphics;       import java ...

  10. 李洪强iOS经典面试题137-内存管理

      内存管理 ARC处理原理 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autoreleas ...