Python学习系列之装饰器

装饰器的作用

装饰器用于装饰某个函数、方法或者类,它可以让这个函数执行之前或者执行之后做一些操作

手工实现一个装饰器

def outer(some_func):   #装饰器  $1
    def inner():
        print("before some_func")$3
        ret = some_func()        $2
        print('after some_func') $4
    return inner



def foo():              #被装饰的函数
    print(1)
decorator = outer(foo)  #把foo函数当做参数传给outer函数 $5
decorator()             #在执行函数

让我们一步步来分析

1.outer函数是装饰器

2.foo函数是被装饰

3.$5处把foo函数当做参数传进outer函数

4.$1处outer函数接收foo函数这个参数

5.$2处inner函数接收outer函数传进来的参数(此例子为:foo函数),ret用来接收foo函数的结果.(inner函数在本函数内找some_func参数找不到就会向上一级找,就找到了,这是python的作用域(闭包),)

6.$3处是在foo函数的结果之前加一段代码,$4处是在foo函数的结果之后加一段代码

所以说原理就是把函数传到装饰器函数里,被装饰函数执行之前先执行一段你想执行的diamante,被装饰函数执行之后再执行一段你想执行的代码

利用装饰器装饰一个函数

定义被装饰函数

代码:
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
def foo(arg):    # 接受一个参数arg
    print(arg)   # 输出这个参数
foo("Hello World!")  # 调用脚本并且传入参数

现在要在foo函数执行之前和执行之后来执行一些操作

#!/usr/bin/env python
# _*_ coding: utf-8 _*_
def decorator(func):  # 创建一个装饰器函数,接受的参数arg参数就是func函数名
    def inner(*args, **kwargs):
        print("执行函数之前")
        ret = func(*args, **kwargs)
        print("执行函数之后")
        return ret
    return inner
@decorator  # 如果要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名
def foo(arg):
    print(arg)
foo(
"Hello World!") #执行函数,测试

测试结果

执行函数之前
Hello World!
执行函数之后

多个装饰器装饰同一个函数

#!/usr/bin/env python
# _*_ coding: utf-8 _*_
def decorator1(func):
    def inner():
        print("开始之前执行装饰器01")
        ret = func()
        print("结束之后执行装饰器01")
        return ret
    return inner
def decorator2(func):
    def inner():
        print("decorator2>>>Start...")
        ret = func()
        print("decorator2>>>End...")
        return ret
    return inner
@decorator1
@decorator2
def index():
    print("执行函数...")
index()#执行函数测试

结果

开始之前执行装饰器01
decorator2>>>Start...
执行函数...
decorator2>>>End...
结束之后执行装饰器01

 

posted @ 2017-02-06 16:42  差点点温柔  阅读(236)  评论(0编辑  收藏  举报