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实现高效求解素数代码实例
Jun 30 Python
Python设置默认编码为utf8的方法
Jul 01 Python
python 获取键盘输入,同时有超时的功能示例
Nov 13 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
对Python中画图时候的线类型详解
Jul 07 Python
python实现数据分析与建模
Jul 11 Python
python画微信表情符的实例代码
Oct 09 Python
python内打印变量之%和f的实例
Feb 19 Python
django admin后管定制-显示字段的实例
Mar 11 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
opencv检测动态物体的实现
Jul 21 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 无限级 SelectTree 类
2009/05/19 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
PHP中的替代语法介绍
2015/01/09 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
由Javascript实现的页面日历
2011/11/04 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
Unix如何添加新的用户
2014/08/20 面试题
幼儿园托班开学寄语
2014/01/18 职场文书
浙大毕业生自荐信
2014/01/26 职场文书
超市食品安全承诺书
2015/04/29 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
导游词之山东孔庙
2019/11/04 职场文书
浅谈python数据类型及其操作
2021/05/25 Python
详解Python自动化之文件自动化处理
2021/06/21 Python
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL
MySQL分区表管理命令汇总
2022/03/21 MySQL