python装饰器使用方法实例


Posted in Python onNovember 21, 2013

什么是python的装饰器?

网络上的定义:
装饰器就是一函数,用来包装函数的函数,用来修饰原函数,将其重新赋值给原来的标识符,并永久的丧失原函数的引用。

最能说明装饰器的例子如下:

#-*- coding: UTF-8 -*-
import timedef foo():
    print 'in foo()'
# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法
def timeit(func):
    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print 'used:', end - start
    # 将包装后的函数返回
    return wrapper
foo = timeit(foo)
foo()

python中提供了一个@符号的语法糖,用来简化上面的代码,他们的作用一样

import timedef timeit(func):
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print 'used:', end - start
    return wrapper
@timeit
def foo():
    print 'in foo()'
foo()

这2段的代码是一样的,等价的。

内置的3个装饰器,他们分别是staticmethod,classmethod,property,他们的作用是分别把类中定义的方法变成静态方法,类方法和属性,如下:

class Rabbit(object):    def __init__(self, name):
        self._name = name
    @staticmethod
    def newRabbit(name):
        return Rabbit(name)
    @classmethod
    def newRabbit2(cls):
        return Rabbit('')
    @property
    def name(self):
        return self._name

装饰器的嵌套:
就一个规律:嵌套的顺序和代码的顺序是相反的。
也是来看一个例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-
def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped
def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped
@makebold
@makeitalic
def hello():
    return "hello world"
print hello()

返回的结果是:
<b><i>hello world</i></b>
为什么是这个结果呢?
1.首先hello函数经过makeitalic 函数的装饰,变成了这个结果<i>hello world</i>
2.然后再经过makebold函数的装饰,变成了<b><i>hello world</i></b>,这个理解起来很简单。

Python 相关文章推荐
Python中title()方法的使用简介
May 20 Python
简单介绍Python的Django框架的dj-scaffold项目
May 30 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
基于python爬虫数据处理(详解)
Jun 10 Python
python实现Decorator模式实例代码
Feb 09 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
Python 中的lambda函数介绍
Oct 10 Python
python学生管理系统
Jan 30 Python
python3使用matplotlib绘制条形图
Mar 25 Python
python使用minimax算法实现五子棋
Jul 29 Python
tornado框架blog模块分析与使用
Nov 21 #Python
python迭代器的使用方法实例
Nov 21 #Python
python生成器的使用方法
Nov 21 #Python
python单链表实现代码实例
Nov 21 #Python
python双向链表实现实例代码
Nov 21 #Python
python二叉树遍历的实现方法
Nov 21 #Python
python二叉树的实现实例
Nov 21 #Python
You might like
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
php发送与接收流文件的方法
2015/02/11 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
电气专业应届生求职信
2013/11/01 职场文书
化学教师自荐信范文
2013/12/28 职场文书
结婚典礼证婚词
2014/01/08 职场文书
三年级小学生评语
2014/04/22 职场文书
小班评语大全
2014/05/04 职场文书
租房协议书范文
2014/08/20 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python