python 装饰器功能以及函数参数使用介绍


Posted in Python onJanuary 27, 2012

简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的。例如为了把foo()函数声明成一个静态函数

class Myclass(object): 
def staticfoo(): 
............ 
............ 
staticfoo = staticmethod(staticfoo)

可以用装饰器的方法实现:
class Myclass(object): 
@staticmethod
 

def staticfoo(): 


......... 


.........

这个例子很明显很容易就可以看懂。

说到这里我们举一个下面的例子,这个例子里面同时涉及到一个重要内容,就是对于python中的函数的本质理解。

代码:

# -*- coding: utf-8 -*- 
from time import ctime 
from time import sleep 
def ftfunc(func): 
def timef(): 
print "[%s] %s() called" % (ctime(),func.__name__) 
return func() 
return timef @ftfunc 
def foo(): 
print 'hello' 
if __name__ == '__main__': 
foo() 
sleep(2) 
for i in range(2): 
sleep(1) 
foo()

运行这段代码;我们可以看到终端依次会输出以下内容:

python 装饰器功能以及函数参数使用介绍
其中ftfunc函数是我们自己自定义的一个函数,这个函数是以一个函数作为参数的函数,这也就满足了作为一个装饰器的要求,根据上面我们对于装饰器的等价变换规则,这段代码

@ftfunc 
def foo(): 
print 'hello'

可以转换成以下的代码:
def foo(): 
print 'hello' foo = ftfunc(foo)

再结合上面原来的代码我们很快就可以体会到了装饰器的作用。

但是我在编写这段代码的时候,有一个地方打错了:

这段代码:

return func() 
return timef

被我写成了:
return func 
return timef

于是输出结果就是不一样,后来终于发现了一个重要的概念:"foo"是函数对象的引用,而"foo()"是函数对象的调用。关于对象引用是python的重要的基础概念,在python中一切都是对象,同时类型是属于对象,而不是变量。一切的变量只是对象的引用,相当于让这个变量指向这个对象。“foo”正好可以理解成一个变量,只不过是它指向一个函数的对象。而“foo()”是函数对象的调用,即调用这个对象,是要执行这个函数的功能的。这里需要慢慢理解品味。基于此:

这样的一段代码运行结果和刚才是一模一样的。注意比较与刚才那段代码的不同之处,更加有利于理解。

# -*- coding: utf-8 -*- 
from time import ctime 
from time import sleep 
def ftfunc(func): 
def timef(): 
print "[%s] %s() called" % (ctime(),func.__name__) 
return func 
return timef @ftfunc 
def foo(): 
print 'hello' 
if __name__ == '__main__': 
foo()() 
sleep(2) 
for i in range(2): 
sleep(1) 
foo()()

此代码运行结果:

python 装饰器功能以及函数参数使用介绍

其实还可以分别对返回的timef函数加上括号,看看结果会是怎么样的。可以更好理解python中函数的概念。

Python 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
在Mac OS上搭建Python的开发环境
Dec 24 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
python中如何使用分步式进程计算详解
Mar 22 Python
详解用python写一个抽奖程序
May 10 Python
Django如何开发简单的查询接口详解
May 17 Python
Python微信操控itchat的方法
May 31 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
python中用ggplot绘制画图实例讲解
Jan 26 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 Python
Python常见文件操作的函数示例代码
Nov 15 #Python
python 控制语句
Nov 03 #Python
python 不关闭控制台的实现方法
Oct 23 #Python
python中将阿拉伯数字转换成中文的实现代码
May 19 #Python
python访问纯真IP数据库的代码
May 19 #Python
Python模块学习 re 正则表达式
May 19 #Python
PYTHON正则表达式 re模块使用说明
May 19 #Python
You might like
php 删除记录实现代码
2009/03/12 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
python二分查找算法的递归实现方法
2016/05/12 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
python3中的md5加密实例
2018/05/29 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
校友会欢迎辞
2014/01/13 职场文书
自荐书4要点
2014/01/25 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
2014年领班工作总结
2014/11/25 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技