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 相关文章推荐
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
Jun 26 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
Python读取二进制文件代码方法解析
Jun 22 Python
python使用布隆过滤器的实现示例
Aug 20 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
Python图像读写方法对比
Nov 16 Python
Python编写万花尺图案实例
Jan 03 Python
Python实现简繁体转换
Jun 07 Python
Python中super().__init__()测试以及理解
Dec 06 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 25 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里大量数据循环时内存耗尽的方法
2015/10/10 PHP
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
jquery each()源代码
2011/02/14 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python 返回汉字的汉语拼音
2009/02/27 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Python中的__slots__示例详解
2017/07/06 Python
python中Lambda表达式详解
2019/11/20 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
python类中super() 的使用解析
2019/12/19 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
在校硕士自我鉴定
2014/01/23 职场文书
护理目标管理责任书
2014/07/25 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
2015年个人思想总结
2015/03/09 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
Mysql案例刨析事务隔离级别
2021/09/25 MySQL
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python