python学习笔记-装饰器

原创 2017年01月02日 22:10:18

python装饰器是在函数调用之上的修饰,这些修饰是在声明或者定义一个函数的时候进行设置的。同时,装饰器是一个返回函数对象的高级函数。装饰器的语法是以@开头的,而后是装饰器函数的名字以及可选的参数,而后是装饰器要修饰的函数以及该函数的可选参数,主要是以下形式:

@decorator(dec_opt_args)
def func2Bdecorator(func_opt_args):
......

1 装饰器与函数类型

装饰器类型

装饰器有两种形式,无参decorator以及有参decorator:
无参decorator
生成一个新的经过装饰的函数,并用这个经过装饰的函数代替原函数
有参decorator
装饰函数首先处理传入的decorator参数,并生成一个新的装饰器函数,然后使用这个装饰器函数对要被装饰的函数进行装饰
函数类型

同时函数又分为有参和无参两种
无参函数
对于无参数的函数,并没有什么需要特别注意的地方
有参函数
因为传入装饰器的函数是不定的,也就是说传入的参数也是不定的,为了使装饰器能对所有参数类型的函数进行处理,装饰器中函数的参数有特殊处理,接下来会介绍

2 无参装饰器-无参函数

def decorator_func(func):
    def handle():
        print "the function of %s begin ..." %func.__name__
        func()
        print "the function of %s end !" %func.__name__
    return handle

@decorator_func
def say():
    print "hello decorator!"

say( )
print say.__name__

上述代码最后调用say函数的输出如下:


the function of say begin ...
hello decorator!
the function of say end!
handle

decorator_func是一个装饰器(decorator),返回一个函数对象。上述代码中,在定义say函数前加上了@decorator_func之后,虽然say( )函数还是存在的,但是say变量指向了由decorator_func返回的handle函数对象,于是在上述代码的最后打印say的函数名的输出结果是handle而不是say。

3 无参装饰器-有参函数

当需要修饰的函数带有参数时,装饰器的定义跟上述无参函数有一定的区别,主要为了让装饰器可以应对具有参数不同的各种函数


def decorator_func(func):
    def handle(*args, **kwargs):
        print "the function of %s begin ..." %func.__name__
        func(*args, **kwargs)
        print "the function of %s end !" %func.__name__
    return handle

@decorator
def say(name = "world"):
    print "hello %s!" %name

4 有参装饰器-无参函数

当装饰器带有参数,也就是在原来装饰器的基础上再做一层封装。代码实现如下:

def decomaker_func(text):
    def decorator_func(func):
        def handle():
            print "%s-->%s()!" %(text, func.__name__)
            func()
        return handle
    return decorator_func

@decomaker_func("haha")
def say():
    print "hello, decomaker!"

say()

上述代码的输出:

haha-->say()
hello, decomaker!

因装饰器自身带有参数,于是将其称之为decomaker,也就是上述定义中的第一层函数decomaker_func,它的作用是返回一个decorator也就是第二层函数decorator_func,这层函数的作用就是将封装好的handle函数赋值给say变量。

5 有参装饰器-有参函数

def decomaker_func(text):
    def decorator_func(func):
        def handle(*args, **kwargs):
            print "%s-->%s(*args, **kwargs)!" %(text, func.__name__)
            func(*args, **kwargs)
        return handle
    return decorator_func

@decomaker_func("haha")
def say(name = "decomaker"):
    print "hello, %s!" %name

say()

输出:


haha-->say(*args**kwargs)
hello, decomaker!

6 给函数装饰多个装饰器

当一个函数由多个装饰器进行装饰时,其装饰过程是有固定的顺序的,比如如下的形式:

@d1
@d2(args)
@d3
def f():

等价于:

f = d1(d2(args)(d3(f)))
版权声明:本文为博主原创文章,未经博主允许不得转载。

Python装饰器:简单装饰,带参数装饰与类装饰器

Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。 第一步:最简单的函数,准备附加额外功能 # -*- coding:g...
  • dreamcoding
  • dreamcoding
  • 2013年02月25日 22:58
  • 25746

浅谈Python装饰器

浅谈Python装饰器 By 马冬亮(凝霜  Loki) 一个人的战争(http://blog.csdn.net/MDL13412) 前置知识 一级对象 Python将一切视为 objec t的...
  • MDL13412
  • MDL13412
  • 2014年03月30日 22:07
  • 40557

Python装饰器详解

在上一篇文章中我们提到了闭包,也就是将函数作为返回值返回。闭包搞懂了之后,接下来的内容就很简单了。在定义了许多函数之后,我们希望扩展这些函数的功能,譬如在函数调用前后自动打印日志,但如果是一些通用的功...
  • destinyuan
  • destinyuan
  • 2016年05月31日 20:12
  • 1104

python 常用装饰器

@property 对于类的方法, Python内置的@property装饰器就是负责把一个方法变成属性调用的...
  • flyDeDog
  • flyDeDog
  • 2017年03月31日 15:17
  • 343

Python实战小程序——装饰器

第四题:简述对Python装饰器的理解,写一个简单的装饰器。 要理解装饰器,我们先介绍一下几点python的基础知识。 1、作用域(命名空间)及变量生存周期 有过一点编程基础的都知道namesp...
  • misayaaaaa
  • misayaaaaa
  • 2016年11月04日 16:15
  • 833

Python多个装饰器的顺序

原文链接:http://www.cnblogs.com/nisen/p/6193426.html?utm_source=itdadao&utm_medium=referral 装饰器是Pyth...
  • jyhhhhhhh
  • jyhhhhhhh
  • 2017年01月20日 02:51
  • 2043

Python 装饰器装饰类中的方法

title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] c...
  • hesi9555
  • hesi9555
  • 2017年04月18日 09:54
  • 2225

python装饰器简介---这一篇也许就够了

Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼。 装饰器引入初期及问题诞生假如现在在一个公司,有A B C三个业务部门,还有S一个基础服...
  • u010358168
  • u010358168
  • 2017年09月01日 14:57
  • 295

Python-自定义装饰器

什么是装饰器?装饰器本质是一个函数,它可以在不改变原来的函数的基础上额外的增加一些功能。如常见的@classmethod,@staticmethod等都是装饰器,接下来记录下如何自定义个装饰器:刚刚说...
  • y472360651
  • y472360651
  • 2017年06月10日 20:18
  • 999

python装饰器(decorator)

什么是装饰器(decorator)   简单来说,可以把装饰器理解为一个包装函数的函数,它一般将传入的函数或者是类做一定的处理,返回修改之后的对象.所以,我们能够在不修改原函数的基础上,在执行原函数前...
  • shuaijiasanshao
  • shuaijiasanshao
  • 2016年05月12日 16:05
  • 2540
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python学习笔记-装饰器
举报原因:
原因补充:

(最多只允许输入30个字)