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写的创建文件夹自定义函数mkdir()
Aug 25 Python
Python字符串详细介绍
May 09 Python
python3 shelve模块的详解
Jul 08 Python
python运行其他程序的实现方法
Jul 14 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
python中单例常用的几种实现方法总结
Oct 13 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
Python实现随机爬山算法
Jan 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
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
js 文件引入实现代码
2010/04/23 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
实现python版本的按任意键继续/退出
2016/09/26 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
python实现随机梯度下降法
2020/03/24 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
pandas分区间,算频率的实例
2019/07/04 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
工作感想范文
2015/08/07 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python