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 startswith()函数与endswith函数
Sep 08 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
详解Numpy中的广播原则/机制
Sep 20 Python
python中实现控制小数点位数的方法
Jan 24 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
Python线程指南分享
Nov 19 Python
Python守护进程实现过程详解
Feb 10 Python
Python基于Webhook实现github自动化部署
Nov 28 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
基于JQUERY的多级联动代码
2012/01/24 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
JS实现小米轮播图
2020/09/21 Javascript
初学python数组的处理代码
2011/01/04 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
python+logging+yaml实现日志分割
2019/07/22 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
工作自荐信
2013/12/11 职场文书
模具毕业生推荐信
2014/02/15 职场文书
《去年的树》教学反思
2014/04/11 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
运动会100米加油稿
2015/07/21 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
JavaScript原型链详解
2021/11/07 Javascript
详解Python中的for循环
2022/04/30 Python