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 Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Python中Random和Math模块学习笔记
May 18 Python
详解python中requirements.txt的一切
Mar 03 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
Jul 24 Python
Python实现注册登录系统
Aug 08 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 Python
Python tkinter三种布局实例详解
Jan 06 Python
Python数据库封装实现代码示例解析
Sep 05 Python
python tqdm库的使用
Nov 30 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 Python
python 远程执行命令的详细代码
Feb 15 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/11/03 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
js 文件引入实现代码
2010/04/23 Javascript
JQuery小知识
2010/10/15 Javascript
基于jquery的拖动布局插件
2011/11/25 Javascript
js中有关IE版本检测
2012/01/04 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
详解如何运行vue项目
2019/04/15 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
Python模块搜索路径代码详解
2018/01/29 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
python创建文本文件的简单方法
2020/08/30 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
表决心的诗句大全
2014/03/11 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
检讨书范文300字
2015/01/28 职场文书
班委竞选稿范文
2015/11/21 职场文书
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS