在定义函数时,有时候需要使用多个函数有相同的功能或者想要给函数增加新的功能,装饰器可以给方法或函数增加新的功能,自定义模板给多个函数或者方法进行修饰
闭包
def External_functions(num1): #定义外部函数 External_functions
def Intrinsic_functions(num2): #定义内部函数 Intrinsic_functions
print(num1 + num2)
# 返回内部函数的引用
return Intrinsic_functions
# 给外部函数赋值 因为内部函数引用了外部函数的形参或者局部变量
# 引用计数增加 函数结束后引用计数不为零不会被销毁
# s1 = 尾部函数的返回值并给num1 赋值
s1 = External_functions(3)
# 调用s1 调用内部函数Intrinsic_functions并传参
s1(2)
装饰器
def External_functions(fun):
def Intrinsic_functions():
print('装饰函数前装饰效果')
fun()
print('装饰函数后装饰效果')
return Intrinsic_functions
#定义被装饰函数
def fun_1():
print('fun_1')
# 函数的本质就是function对象,函数可以当做参数进行传递
# 将fun_1作为参数传递给External_functions(fun)
s1 =External_functions(fun_1)
s1()
通用装饰器:
def External_functions(fun,*args,**kwargs):
def Intrinsic_functions(*args,**kwargs):
print('装饰函数前')
fun(*args, **kwargs)
print('装饰函数后')
return Intrinsic_functions
#语法糖 定义函数时 @外部函数名 即可达到引用装饰器效果 #####
@External_functions(外部函数参数列表)
def fun_2(num_1,num_2):
print(num_1+num_2)
fun_2(3,5)
函数参数传递过程: