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使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
Python+微信接口实现运维报警
Aug 27 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
python实现扫描ip地址的小程序
Apr 16 Python
django model通过字典更新数据实例
Apr 01 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
Aug 24 Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 Python
pandas DataFrame.shift()函数的具体使用
May 24 Python
Python Matplotlib绘制等高线图与渐变色扇形图
Apr 14 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/04/09 日漫
乱谈我对耳机、音箱的感受
2021/03/02 无线电
聊天室php&mysql(五)
2006/10/09 PHP
php 多个submit提交表单 处理方法
2009/07/07 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
用js做一个小游戏平台 (一)
2009/12/29 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
酒吧副总经理岗位职责
2013/12/10 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
离职报告格式
2014/11/04 职场文书
2014年护理部工作总结
2014/11/14 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书