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返回昨天日期的方法
May 13 Python
numpy排序与集合运算用法示例
Dec 15 Python
一份python入门应该看的学习资料
Apr 11 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
详解pandas的外部数据导入与常用方法
May 01 Python
python添加菜单图文讲解
Jun 04 Python
django实现用户注册实例讲解
Oct 30 Python
python对Excel的读取的示例代码
Feb 14 Python
Python接口开发实现步骤详解
Apr 26 Python
基于python实现可视化生成二维码工具
Jul 08 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
快速解决pymongo操作mongodb的时区问题
Dec 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 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
JavaScript移除数组元素减少长度的方法
2013/09/05 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
Python 将pdf转成图片的方法
2018/04/23 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
django框架F&amp;Q 聚合与分组操作示例
2019/12/12 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
最新党员思想汇报
2014/01/01 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
标准化管理实施方案
2014/02/25 职场文书
电钳工人个人求职信
2014/05/10 职场文书
统计员岗位职责
2015/02/11 职场文书
放牛班的春天观后感
2015/06/01 职场文书
宇宙与人观后感
2015/06/05 职场文书
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python