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 相关文章推荐
详解Python3操作Mongodb简明易懂教程
May 25 Python
TensorFlow变量管理详解
Mar 10 Python
通过python顺序修改文件名字的方法
Jul 11 Python
使用Scrapy爬取动态数据
Oct 21 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
Django给admin添加Action的步骤详解
May 01 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
如何在Python中实现goto语句的方法
May 18 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
python pycharm的安装及其使用
Oct 11 Python
python Gabor滤波器讲解
Oct 26 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
Laravel框架表单验证详解
2014/09/04 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
JS backgroundImage控制
2009/05/19 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
javascript常用的方法分享
2015/07/01 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
js中this的指向问题归纳总结
2018/11/28 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
python抓取网页图片示例(python爬虫)
2014/04/27 Python
Python创建日历实例
2014/08/21 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
密封类可以有虚函数吗
2014/08/11 面试题
小学教师师德反思
2014/02/03 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
销售员态度差检讨书
2014/10/26 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
比较node.js和Deno
2021/04/27 Javascript
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers