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实现异步回调机制代码分享
Jan 10 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
Python批量修改图片分辨率的实例代码
Jul 04 Python
在python中画正态分布图像的实例
Jul 08 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
Django 实现将图片转为Base64,然后使用json传输
Mar 27 Python
Python json读写方式和字典相互转化
Apr 18 Python
Python中Selenium模块的使用详解
Oct 09 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 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
桌面中心(四)数据显示
2006/10/09 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
Vue formData实现图片上传
2019/08/20 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
Python性能优化技巧
2015/03/09 Python
python图像处理之镜像实现方法
2015/05/30 Python
批处理与python代码混合编程的方法
2016/05/19 Python
django框架如何集成celery进行开发
2017/05/24 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
python os模块简单应用示例
2019/05/23 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
新闻专业个人求职信
2013/12/19 职场文书
给同学的道歉信
2014/01/16 职场文书
党员干部公开承诺书
2014/03/26 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
五年级作文之学校的四季
2019/12/05 职场文书