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中的序列化存储的方法
Apr 28 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
创建pycharm的自定义python模板方法
May 23 Python
python 自定义装饰器实例详解
Jul 20 Python
pygame实现贪吃蛇游戏(下)
Oct 29 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 Python
Python标准库之typing的用法(类型标注)
Jun 02 Python
python cv2图像质量压缩的算法示例
Jun 04 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 保留小数点
2009/04/21 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
Python创建文件和追加文件内容实例
2014/10/21 Python
21行Python代码实现拼写检查器
2016/01/25 Python
详解Python import方法引入模块的实例
2017/08/02 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
用Python实现KNN分类算法
2017/12/22 Python
python学习入门细节知识点
2018/03/29 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python实现对服务器脚本敏感信息的加密解密功能
2019/08/13 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
篝火晚会主持词
2014/03/25 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
学习党章的体会
2014/11/07 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android
Python多线程 Queue 模块常见用法
2021/07/04 Python
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js