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中os和shutil模块实用方法集锦
May 13 Python
Python中非常实用的一些功能和函数分享
Feb 14 Python
Python 模块EasyGui详细介绍
Feb 19 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
Python生成器generator用法示例
Aug 10 Python
浅析python继承与多重继承
Sep 13 Python
django框架防止XSS注入的方法分析
Jun 21 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
Python request中文乱码问题解决方案
Sep 17 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
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
python妙用之编码的转换详解
2017/04/21 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Django框架反向解析操作详解
2019/11/28 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
New Balance美国官网:运动鞋和健身服装
2017/04/11 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
最新的咖啡店创业计划书
2013/12/30 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
学生会主席事迹材料
2014/01/28 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
小学校园广播稿
2015/08/18 职场文书
电力安全学习心得体会
2016/01/18 职场文书
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS