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动态监控日志内容的示例
Feb 16 Python
Python的Scrapy爬虫框架简单学习笔记
Jan 20 Python
Python网络爬虫实例讲解
Apr 28 Python
Python设计模式之工厂模式简单示例
Jan 09 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
python ddt数据驱动最简实例代码
Feb 22 Python
python三大神器之fabric使用教程
Jun 10 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
python源文件的字符编码知识点详解
Mar 04 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新手上路(十)
2006/10/09 PHP
PHP面向对象分析设计的经验原则
2008/09/20 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
js版本A*寻路算法
2006/12/22 Javascript
js 页面输出值
2008/11/30 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
javascript动画浅析
2012/08/30 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
Python实现代码块儿折叠
2020/04/15 Python
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
历史学专业推荐信
2013/11/06 职场文书
七一表彰活动方案
2014/01/18 职场文书
先进集体事迹材料
2014/02/17 职场文书
驳回起诉裁定书
2015/05/19 职场文书
欠条格式范本
2015/07/03 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书