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中执行shell命令的几个方法小结
Sep 18 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
Feb 17 Python
浅析Python编写函数装饰器
Mar 18 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
python实现SOM算法
Feb 23 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
python+jinja2实现接口数据批量生成工具
Aug 28 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
python中requests库+xpath+lxml简单使用
Apr 29 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学习教程之第2天
2008/06/15 PHP
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
IE下js调试工具Companion.JS
2010/10/15 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
python 统计代码行数简单实例
2017/05/04 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
python删除某个目录文件夹的方法
2020/05/26 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
Ruby如何创建一个线程
2013/03/10 面试题
保安的辞职报告怎么写
2014/01/20 职场文书
影视后期实训报告
2014/11/05 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python