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实现字符串格式化输出的方法详解
Sep 20 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
Django配置celery(非djcelery)执行异步任务和定时任务
Jul 16 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
Python sorted函数详解(高级篇)
Sep 18 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
Python数据类型之Set集合实例详解
May 07 Python
Python通用函数实现数组计算的方法
Jun 13 Python
新手入门Python编程的8个实用建议
Jul 12 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
总结Python变量的相关知识
Jun 28 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
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
2015/05/25 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
Bootstrap模块dropdown实现下拉框响应
2016/05/22 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
Python 解析XML文件
2009/04/15 Python
Python迭代器和生成器介绍
2015/03/06 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
廉洁家庭事迹材料
2014/05/15 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏