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利用hook技术破解https的实例代码
Mar 25 Python
Python实现基本线性数据结构
Aug 22 Python
Python 调用Java实例详解
Jun 02 Python
Python函数式编程
Jul 20 Python
python3个性签名设计实现代码
Jun 19 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
Python实现计算对象的内存大小示例
Jul 10 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 Python
使用Keras实现简单线性回归模型操作
Jun 12 Python
python在linux环境下安装skimage的示例代码
Oct 14 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生成缩略图的函数代码(修改版)
2011/01/18 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
javascript radio 联动效果
2009/03/04 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
用python登录Dr.com思路以及代码分享
2014/06/25 Python
用python实现对比两张图片的不同
2018/02/05 Python
Django之PopUp的具体实现方法
2019/08/31 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
如何通过python实现人脸识别验证
2020/01/17 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
数据库专业英语
2012/11/30 面试题
实习心得体会
2014/01/02 职场文书
电子商务专业求职信
2014/03/08 职场文书
党员创先争优活动总结
2014/05/04 职场文书
教育见习报告范文
2014/11/03 职场文书
小学生表扬稿范文
2015/05/05 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS