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 相关文章推荐
一篇不错的Python入门教程
Feb 08 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Python正则表达式使用经典实例
Jun 21 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
python如何使用unittest测试接口
Apr 04 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
使用gunicorn部署django项目的问题
Dec 30 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
西德产收音机
2021/03/01 无线电
php分页示例代码
2007/03/19 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
2016/10/27 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
使用Python操作ArangoDB的方法步骤
2020/02/02 Python
解决Django no such table: django_session的问题
2020/04/07 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
python 如何调用 dubbo 接口
2020/09/24 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
《中国的气候》教学反思
2014/02/23 职场文书
舞蹈专业求职信
2014/06/13 职场文书
排球赛新闻稿
2015/07/17 职场文书
Python图像处理之图像拼接
2021/04/28 Python