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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
跟老齐学Python之赋值,简单也不简单
Sep 24 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
python下载图片实现方法(超简单)
Jul 21 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
python编写微信公众号首图思路详解
Dec 13 Python
Python对Tornado请求与响应的数据处理
Feb 12 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
python实现文件+参数发送request的实例代码
Jan 05 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中文转拼音的实现代码
2014/02/11 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
类之Prototype.js学习
2007/06/13 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
利用css+原生js制作简单的钟表
2020/04/07 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
vue实现扫码功能
2020/01/17 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
从Python的源码来解析Python下的freeblock
2015/05/11 Python
Python实现线程状态监测简单示例
2018/03/28 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
在线课程:Skillshare
2019/04/02 全球购物
应聘自荐信
2013/12/14 职场文书
小学后勤管理制度
2014/01/14 职场文书
会计专业应届生自荐信
2014/02/07 职场文书
新春寄语大全
2014/04/09 职场文书
小学校长先进事迹材料
2014/05/13 职场文书
班级体育活动总结
2014/07/05 职场文书
大学生见习总结报告
2015/06/24 职场文书
学校少先队工作总结
2015/08/12 职场文书