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中的二叉树查找算法模块使用指南
Jul 04 Python
浅谈编码,解码,乱码的问题
Dec 30 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
高效使用Python字典的清单
Apr 04 Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
jupyter notebook实现显示行号
Apr 13 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
python 5个实用的技巧
Sep 27 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
python变量的作用域是什么
2020/05/26 Python
简历自荐信
2013/12/02 职场文书
保险公司年会主持词
2014/03/22 职场文书
绿色学校实施方案
2014/03/31 职场文书
工商管理自荐书
2014/07/06 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
优秀党支部申报材料
2014/12/24 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android