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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
python获取list下标及其值的简单方法
Sep 12 Python
python实现周期方波信号频谱图
Jul 21 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
Python 3.8中实现functools.cached_property功能
May 29 Python
python 公共方法汇总解析
Sep 16 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
基于selenium及python实现下拉选项定位select
Jul 22 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
python 模拟登录B站的示例代码
Dec 15 Python
python批量提取图片信息并保存的实现
Feb 05 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
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
PHP实现的简单缓存类
2015/07/29 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
Python中优化NumPy包使用性能的教程
2015/04/23 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
学习Python列表的基础知识汇总
2020/03/10 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
美术教师岗位职责
2014/03/18 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
慰问信格式
2015/02/14 职场文书
第一书记观后感
2015/06/08 职场文书
现实表现证明材料
2015/06/19 职场文书
初中运动会前导词
2015/07/20 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android