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 时间处理datetime实例
Sep 06 Python
对于Python中线程问题的简单讲解
Apr 03 Python
python读取txt文件中特定位置字符的方法
Dec 24 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
基于h5py的使用及数据封装代码
Dec 26 Python
带你学习Python如何实现回归树模型
Jul 16 Python
python实现梯度下降算法的实例详解
Aug 17 Python
calendar在python3时间中常用函数举例详解
Nov 18 Python
python解压zip包中文乱码解决方法
Nov 27 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
Python3.10的一些新特性原理分析
Sep 15 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自带方法验证邮箱是否存在
2016/02/01 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
vue利用axios来完成数据的交互
2018/03/23 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
Python3 读取Word文件方式
2020/02/13 Python
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
什么是Remote Module
2016/06/10 面试题
学生自我鉴定
2013/12/18 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
《小小雨点》教学反思
2014/02/18 职场文书
社区戒毒工作方案
2014/06/04 职场文书
百日安全生产活动总结
2014/07/05 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS