# 函数的定义和调用
# def 函数名(形参):
#函数体
#return 返回值
#调用 函数名(实参)
# 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs
# 站在实参的角度上 : 按照位置传,按照关键字传
# 返回值:没有返回值 返回一个值 返回多个值
# 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收
# 闭包函数 —— 在内部函数引用外部函数的变量
# 装饰器函数—— 装饰器一定是闭包函数
# 装饰器的作用 : 在不改变原来函数的调用方式的情况下 在这个函数的前后添加新的功能
# 完美的符合了一个开发原则 :开放封闭原则
# 对扩展是开发的
# 对修改是封闭的
# 基础的装饰器
from functools import wraps def wrapper(func): @wraps(func) def inner(*args,**kwargs): # '''在函数被调用之前添加的代码''' ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 # '''在函数被调用之后添加的代码''' return ret return inner #使用 —— @wrapper @wrapper def func(): #inner pass func.__name__
# 带参数的装饰器
def outer(形参): def wrapper(func): def inner(*args,**kwargs): '''在函数被调用之前添加的代码''' ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 '''在函数被调用之后添加的代码''' return ret return inner return wrapper @outer(True) def func(): pass
# 多个装饰器装饰一个函数
def wrapper1(func): @wraps(func) def inner(*args,**kwargs): print('before 1') print('******') ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 '''在函数被调用之后添加的代码''' return ret def wrapper2(func): @wraps(func) def inner(*args,**kwargs): print('before 2') ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用 '''在函数被调用之后添加的代码''' return ret @wrapper1 @wrapper2 def func(): print('111')