函数装饰器:
开闭原则:在面向对象编程领域中,开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,
但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。
三要素:
1、不能更改原函数
2、不能改变被装饰函数的调用方式
3、满足1、2的情况下给程序增加功能 (这个函数不能动)
定义公式:<函数+实参高阶函数+返回值高阶函数+闭包函数+语法糖=装饰器>
常用场景:它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
多个装饰器同时修饰函数:装饰器执行顺序:从最后一个装饰器开始执行到第一个装饰器
"""
# 简单的装饰器
# def fn(f1):
# def fc():
# print("这里开始对f1函数权限进行验证")
# f1()
# print("f1函数已经处理完毕了")
# return fc
#
# def f1():
# print("这里f1函数的功能展示")
#
# t = fn(f1)
# t()
# 为了可视化和模块化,对上面的同一个功能的高级装饰函数进行统一标识,达到更好的效果
# @fn #这个@fn标识符效果等同于f1=fn(f1)
# 注意这个时候函数不用再这样fn(f1)()的调用了,而是直接使用f1()即可达到fn(f1)()的效果了
# 因为@fn的效果等同于f1=fn(f1),所以直接调用f1()相当于实现了fn(f1)(),进而达到原来的效果。
# def fn(f1):
# def fc():
# print("这里开始对f1函数权限进行验证")
# f1()
# print("f1函数已经处理完毕了")
# return fc
#
# @fn
# def f1():
# print("这里f1函数的功能展示")
#
# f1()
## 多个装饰器装饰被装饰函数的执行顺序
# def makeBold(fun):
# print('----a----')
# def inner():
# print('----1----')
# return '<b>' + fun() + '</b>'
# return inner
#
# def makeItalic(fun):
# print('----b----')
# def inner():
# print('----2----')
# return '<i>' + fun() + '</i>'
# return inner
#
# @makeBold
# @makeItalic
# def test():
# print('----c----')
# print('----3----')
# return 'hello python decorator'
#
# res= test()
# print(res)
## 装饰器传参
# def w_say(fun):
# """
# 如果原函数有参数,那闭包函数必须保持参数个数一致,并且将参数传递给原方法
# 如果被装饰的函数有行参,那么闭包函数必须有参数
# """
# def inner(name):
# print('say inner called')
# fun(name)
# return inner
#
# @w_say
# def hello(name):
# print('hello ' + name)
#
# hello('晓鑫')
# 多个函数使用装饰器 传入多个参数
# def w_add(func):
# def inner(*args, **kwargs):
# print('add inner called')
# func(*args, **kwargs)
# return inner
#
# @w_add
# def add(a, b):
# print('%d + %d = %d' % (a, b, a + b))
#
# @w_add
# def add2(a, b, c):
# print('%d + %d + %d = %d' % (a, b, c, a + b + c))
#
# add(2, 4)
# add2(2, 4, 6)