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 不关闭控制台的实现方法
Oct 23 Python
Python写的一个简单DNS服务器实例
Jun 04 Python
Python计算一个文件里字数的方法
Jun 15 Python
Python中matplotlib中文乱码解决办法
May 12 Python
python监控linux内存并写入mongodb(推荐)
Sep 11 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
pytorch构建网络模型的4种方法
Apr 13 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 Python
Python 最强编辑器详细使用指南(PyCharm )
Sep 16 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
python 实现简单的计算器(gui界面)
Nov 11 Python
python入门学习关于for else的特殊特性讲解
Nov 20 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
农民和部队如何穿矿
2020/03/04 星际争霸
基于PHP编程注意事项的小结
2013/04/27 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
layui表格内容溢出的解决方法
2019/09/06 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
快速入手Python字符编码
2016/08/03 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
Pandas的Apply函数具体使用
2020/07/21 Python
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
.net面试题
2015/12/22 面试题
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
三八节标语
2014/06/27 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
管理失职检讨书范文
2015/05/05 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
MySQL 服务和数据库管理
2021/11/11 MySQL
Windows Server 2008配置防火墙策略详解
2022/06/28 Servers