python之装饰器详解

装饰器的语法以@开头,接着是装饰器函数的名字、可选参数。

紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下:

@decorator(dec_opt_args)

def func(func_args):

  ….

立即学习“Python免费学习笔记(深入)”;

其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,装饰器在函数声明完成的时候被调用,调用之后声明的函数被换成一个被装饰器装饰过后的函数。

如:

def deco(func):   ...   return func@decodef foo():      print 'foo'#-----------------------------------#等价如下:def deco(func):   ...   return funcdef foo():      print 'foo'foo = deco(foo)如下例子:def deco1(func):    print 'ok'    return func@deco1def foo():    print 'foo'foo()#输出--------------#ok#foo#------------------

登录后复制

如果不使用装饰器,则可如下:

def deco1(func):    print 'ok'    return funcdef foo():    print 'foo'print foo           #foo = deco1(foo)   foo()#输出--------------#ok#foo#------------------

登录后复制

两者对比下,可发现使用装饰器是那么简便、灵活。特别是在企业级的开发上。

同时也可以多个装饰器重叠使用:

def deco1(func):    print 'deco1'    return funcdef deco2(func):    print 'deco2'    return func   @deco1@deco2def foo():    print 'foo'foo()#输出如下:-----------#deco2#deco1#foo#---------------------

登录后复制

等效于:

@deco1@deco2def foo(arg):pass-----------与下等效----------foo = deco1(deco2(foo()))

登录后复制

二、有参、无参的装饰器

上面的例子基本上都是有参数的,无参数更为简单。

1、无参

@deco1

@deco2

def foo(arg):pass

———————

foo = deco1(deco2(foo()))

   

2、有参

@deco1(deco_arg)

@deco2

def foo(arg):pass

———————

foo = deco1(deco_arg)(deco2(foo()))

返回以函数作为参数的装饰器

三、用处

1、引用日志

2、增加计时逻辑来检测性能

3、给函数加入事务的能力

四、实例

from time import ctime,sleepdef deco(func):    def decoIn():        print '[%s]:%s called' %(ctime(),func.__name__)        return func    return decoIn@decodef foo():    passfoo()sleep(4)for i in range(2):    sleep(1)    foo()      #输出如下:--------#[Fri Jul 05 10:45:04 2013]:foo called#[Fri Jul 05 10:45:09 2013]:foo called#[Fri Jul 05 10:45:10 2013]:foo called#------------------

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2283633.html

(0)
上一篇 2025年2月27日 20:16:38
下一篇 2025年2月23日 02:28:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python列表类型的所有方法

    列表类型有很多方法,这里是列表类型的所有方法: list.append(x) 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x] 。 list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于 a…

    编程技术 2025年2月27日
    200
  • Python – 命名规范

    一,包名、模块名、局部变量名、函数名 全小写+下划线式驼峰 example:this_is_var 二,全局变量 全大写+下划线式驼峰 立即学习“Python免费学习笔记(深入)”; example:GLOBAL_VAR 三,类名 首字母大…

    编程技术 2025年2月27日
    200
  • python之列表拷贝

    我们需要拷贝一个列表的话,可以用一个特殊的方法,今天给大家说下。 我先定义一个列表 a=[1,2,34] 然后我通过内置方法id()来查看对象的地址 print id(a) 立即学习“Python免费学习笔记(深入)”; 对象地址:1148…

    编程技术 2025年2月27日
    200
  • 强大的zip

    一、代码引导 首先看这一段代码: >>> name=(‘jack’,’beginman’,’sony’,’pcky’)>>> age=(2001,2003,2005,2000)>>> f…

    编程技术 2025年2月27日
    200
  • filter, lambda 函数表达式

    filter(function or none, sequence),其中sequence 可以是list ,tuple,string。这个函数的功能是过滤出sequence 中所有以元素自身作为参数调用function时返回true或bo…

    编程技术 2025年2月27日
    200
  • 字符串格式化 (%操作符)

    在许多编程语言中都包含有格式化字符串的功能,比如c和fortran语言中的格式化输入输出。在python中内置有对字符串进行格式化的操作符是”%”。 模板 格式化字符串时,Python使用一个字符串作为模板。模板中有…

    编程技术 2025年2月27日
    200
  • 元组转字典

    元组:1.使用中括号(())包裹,不可以被更改(尽管他们的内容可以),元组可以看成是 只读 的列表 A. dict.fromkeys(S) S是一个列表或元组… 将S中的元素作为字典的key,value默认为None,也可以指定…

    编程技术 2025年2月27日
    200
  • python基础一

    关于内存分配问题 新定义字符串变量默认新开辟一块新的内存空间 其它类似有索引如列表,元组或是字典赋值时其实只是把变量名指向同一地址空间而已,如下所示 1 ##字符串新定义则开辟新的一块内存空间 2 >>> str1 = &…

    编程技术 2025年2月27日
    200
  • Python基础学习代码之序列

    str1 = ‘abced’for i in range(-1, -len(str1), -1) + [None]:    print str1[:i]s, t = ‘abc’, ‘def’print zip(s, t)for i, t i…

    编程技术 2025年2月27日
    200
  • Python基础学习代码之映像集合

    def func1():    dict1 = {}    dict2 = {‘name’:’earth’,’port’:80}    return dict1,dict2def func2():    return dict(([‘x’,…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论