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
Python多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 Python
打包发布Python模块的方法详解
Sep 18 Python
python+pyqt实现右下角弹出框
Oct 26 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
Python API自动化框架总结
Nov 12 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
详解python对象之间的交互
Sep 29 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 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权重计算方法代码分享
2014/01/09 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
Vue表单实例代码
2016/09/05 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
python实现按行分割文件
2019/07/22 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
毕业求职自荐信格式是什么
2013/11/19 职场文书
经销商会议欢迎词
2014/01/11 职场文书
普通员工辞职信
2014/01/17 职场文书
水利公司纪检监察自我鉴定
2014/02/25 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
路政管理求职信
2014/06/18 职场文书
2019广播稿怎么写
2019/04/17 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
Python 中的 copy()和deepcopy()
2021/11/07 Python
Python开发五子棋小游戏
2022/04/28 Python
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技