1 2 3 4

【python之路24】装饰器

1、装饰器的应用场景

通常IT公司的程序开发是分工的,例如某公司某个部门负责底层函数的开发,另一个部门利用其函数实现高级功能,那么如果负责底层开发的函数需要改动,一般来说不会直接在函数上进行修改,通常利用装饰器在函数外部进行修改。

2、装饰器之@的用法

#!usr/bin/env python
# -*- coding:utf-8 -*-
#装饰器
def outer(func):
    func()
    return lambda :123

#1、首先执行outer函数,并且将其下面的函数名作为参数传给outer
#2、将outer的返回值重新赋值给f1,即f1 = outer的返回值
@outer
def f1():
    print("F1")

re = f1()
print(re)

 

 3、装饰器的主要作用:原函数不变的情况下,可以在函数的前面或后面增加其功能。

下面的代码:

#!usr/bin/env python
# -*- coding:utf-8 -*-
def outer(func):
    def inner1():
        print('start')
        print('start')
        re = func()
        print('end')
        print('end')
        return re
    return inner1

def f1():
    print('F1')

f1 = outer(f1)
f1()

上面的代码等价于装饰器:

#!usr/bin/env python
# -*- coding:utf-8 -*-
def outer(func):
    def inner1():
        print('start')
        print('start')
        re = func()
        print('end')
        print('end')
        return re
    return inner1
@outer
def f1():
    print('F1')

f1()

 执行过程如下图:

 4、含有两个参数的装饰器

#!usr/bin/env python
# -*- coding:utf-8 -*-
#含有两个参数的函数
def outer(func):
    def inner(a1,a2):
        print('开始计算.......')
        re = func(a1,a2)
        print('计算完毕。')
        return re
    return inner
@outer
def add(a1,a2):
    print("复杂的计算")
    return a1+a2

r = add(1,3)
print(r)

 5、任意个参数的装饰器

#!usr/bin/env python
# -*- coding:utf-8 -*-

def outer(func):
    def inner(*args,**kwargs):
        print("开始计算......")
        r = func(*args,**kwargs)#可以为任何参数,python会自动处理参数
        print("计算结束。。")
        return r
    return inner
@outer
def f1(a1,a2):
    return a1+a2
@outer
def f2(a1,a2,a3):
    return a1+a2+a3
@outer
def f3(a1):
    return a1+1

r1 = f1(10,20)
r2 = f2(10,20,30)
r3 = f3(10)
print(r1,r2,r3)

 6、一个函数可以拥有多个装饰器,多个装饰器从上到下执行,例如:

#!usr/bin/env python
# -*- coding:utf-8 -*-
#一个函数可以拥有多个装饰器
def outer_0(func):
    def inner(*args,**kwargs):
        print(3.5)
        r = func(*args,**kwargs)
        return r
    return inner
def outer(func):
    def inner(*args,**kwargs):
        print("开始计算......")
        r = func(*args,**kwargs)#可以为任何参数,python会自动处理参数
        print("计算结束。。")
        return r
    return inner
@outer_0
@outer
def f1(a1,a2):
    return a1+a2
@outer
def f2(a1,a2,a3):
    return a1+a2+a3
@outer
def f3(a1):
    return a1+1

r1 = f1(10,20)
print(r1)

# 结果输出:
# 3.5
# 开始计算......
# 计算结束。。
# 30

 

 

posted @ 2017-02-11 13:03  I我的博客I  阅读(309)  评论(0编辑  收藏  举报