装饰器

装饰器 = 高阶函数 + 函数嵌套 + 闭包
本质就是函数,功能是为其他函数添加新功能
1.不修改被装饰函数的源代码(开放封闭原则)
2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

在需要使用装饰器的函数前面使用语法糖@装饰器

高阶函数定义:
1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件任意一个,都可称之为高阶函数

函数嵌套
函数内又定义有函数(和调用其它函数不是同一个概念)

闭包
在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。
根据这句话,其实我们自己就可以总结出在python语言中形成闭包的三个条件,缺一不可:
1)必须有一个内嵌函数(函数里定义的函数)——这对应函数之间的嵌套
2)内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量
3)外部函数必须返回内嵌函数——必须返回那个内部函数

# # 高阶函数
# def foo():
#     print('我的函数名作为参数传给高阶函数')
#
#
# def gao_jie1(func):
#     print('我就是高阶函数1,我接收的参数名是%s' % func)
#     func()
#
#
# def gao_jie2(func):
#     print('我就是高阶函数2,我的返回值是%s' % func)
#     return func
#
#
# gao_jie1(foo)
# gao_jie2(foo)


# # 嵌套函数
# def father(name):
#     print('from father %s' %name)
#     def son():
#         print('from son')
#         def grandson():
#             print('from grandson')
#         grandson()
#     son()
#
# father('a')


# # '''
# # 闭包:在一个作用域里放入定义变量,相当于打了一个包
# # '''
# def father(name):
#     def son():
#         # name='alex'
#         print('我爸爸是 [%s]' %name)
#         def grandson():
#             # name='wupeiqi'
#             print('我爷爷是 [%s]' %name)
#         grandson()
#     son()
#     # print(locals())
#
# father('a')


# #装饰器架子
# def decorator(func):
#     def wrapper(*args, **kwargs):
#         print(func)
#         res = func(*args, **kwargs)
#         return res
#     return wrapper


# # example
# def decorator(func):
#     def wrapper(*args, **kwargs):
#         print("主持人说:", end='')
#         func(*args, **kwargs)
#     return wrapper
#
# # 在需要使用装饰器的函数前面使用 @ 装饰器
# # @decorator
# @decorator  #say = decorator(say)
# def say():
#     print("大家好")
#
# # say = decorator(say)
# say()
View Code

 

装饰器模板

from functools import wraps


# 无参装饰器
def wrapper(func):  #func 被装饰的函数
    @wraps(func)  # 保留func的所有属性
    def inner(*args, **kwargs):
        # do someting....
        ret = func(*args, **kwargs)
        # do someting....
        return ret
    return inner


# 带参装饰器  
def param(*param):
    def wrapper(func):  #func 被装饰的函数
        @wraps(func)  # 保留func的所有属性
        def inner(*args, **kwargs):
            # do someting....
            ret = func(*args, **kwargs)
            # do someting....
            return ret
        return inner
    return wrapper

 

posted @ 2018-08-16 09:25  李小样  阅读(35)  评论(0编辑  收藏  举报