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的正则表达式re模块的常用方法
Mar 09 Python
跟老齐学Python之类的细节
Oct 13 Python
深入理解Python 代码优化详解
Oct 27 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
python递归全排列实现方法
Aug 18 Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 Python
Python实现FLV视频拼接功能
Jan 21 Python
python 伯努利分布详解
Feb 25 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
python 网络编程要点总结
Jun 18 Python
Python保存并浏览用户的历史记录
Apr 29 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脚本的10个技巧(2)
2006/10/09 PHP
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
使用PHP获取汉字的拼音(全部与首字母)
2013/06/27 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
深入php内核之php in array
2015/11/10 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python中copy()与deepcopy()的区别小结
2018/08/03 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
请解释流与文件有什么不同
2016/07/29 面试题
新年寄语大全
2014/04/12 职场文书
男女朋友协议书
2014/04/23 职场文书
教师节宣传方案
2014/05/23 职场文书
理发店策划方案
2014/06/05 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
飞屋环游记观后感
2015/06/08 职场文书
mysql left join快速转inner join的过程
2021/06/30 MySQL
Golang流模式之grpc的四种数据流
2022/04/13 Golang