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中decorator使用实例
Apr 14 Python
python使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
python获取list下标及其值的简单方法
Sep 12 Python
Python入门_条件控制(详解)
May 16 Python
Python基于socket实现简单的即时通讯功能示例
Jan 16 Python
python如何统计序列中元素
Jul 31 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python实现连连看辅助(图像识别)
Mar 25 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
Django 创建后台,配置sqlite3教程
Nov 18 Python
Python对Tornado请求与响应的数据处理
Feb 12 Python
python实现吃苹果小游戏
Mar 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
咖啡语言
2021/03/03 咖啡文化
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
python动态加载包的方法小结
2016/04/18 Python
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
python小程序实现刷票功能详解
2019/07/17 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
经典大学生求职信范文
2014/01/06 职场文书
市场营销管理制度
2014/01/29 职场文书
给老师的一封建议书
2014/03/13 职场文书
班训口号大全
2014/06/18 职场文书
监理中标通知书
2015/04/16 职场文书
禁毒心得体会范文
2016/01/15 职场文书
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python