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的Django框架使用入门指引
Apr 15 Python
python使用mailbox打印电子邮件的方法
Apr 30 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
Python3.5字符串常用操作实例详解
May 01 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
flask开启多线程的具体方法
Aug 02 Python
Python绘图之二维图与三维图详解
Aug 04 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 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根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
vue使用Axios做ajax请求详解
2017/06/07 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
Python最长公共子串算法实例
2015/03/07 Python
numpy.array 操作使用简单总结
2019/11/08 Python
python操作链表的示例代码
2020/09/27 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
俄罗斯极限运动网上商店:Board Shop №1
2020/12/18 全球购物
学校经典推荐信
2013/10/30 职场文书
校园门卫岗位职责
2013/12/09 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
《鲁班和橹板》教学反思
2014/04/27 职场文书
丽江古城导游词
2015/02/03 职场文书
财务负责人岗位职责
2015/02/03 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS
Spring 使用注解开发
2022/05/20 Java/Android
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS