概念
在不修改元函数或者原对象的基础上,给该函数或者对象增加新的功能
这种工作机制在python中被成为装饰器【Decorator】
语法:装饰器的本质就是一个闭包【Closure】
闭包的写法
def outter1():
num1=10
def inner1():
print (num1)
return inner1
f1=outter1()
f1()
#装饰器的书写语法
def outter2(num):
def inner2():
print(num)
return inner2
f2=outter2(34)
f2()
#注意:
#装饰器可以装饰函数或者类
#1、最简单的装饰器
def func1():
print('111')
#语法:定义一个闭包,值不多比包中外部函数的参数是一个函数【需要被装饰的函数】
def outter2(func):
def inner2():
print('new~~~222')
func()
print('new~~~111')
return inner2
f2=outter2(34)
f2()
好处:在不修改元函数的基础上就可以给原函数加新功能
注意:增加新功能和使用源功能没有前后之分【顺序之分】
outter【外部函数的参数函数名】被称为装饰器名称
强调:不管是普通函数还是装饰器,调用函数的时候都需要注意参数的匹配
def get_age(age):
print(“年龄 %d”%(age))
get_age(10)
get_age(-18)
#需求:书写一个装饰器,可以对年菱作出校验
def outter2(func):
def inner2(n):
if n<0:
n=-n
func(n)
return inner2
f2=outter2(get_age)
f2(-18)
用@用于修饰某个指定的函数
#用*args和**kwargs可以接收不同长参数
def outter2(func):
def inner2(*args,**kwargs):
if n<0:
n=-n
func(*args,**kwargs)
return inner2
@outter2
def get_age(age):
print("年龄 %d"%(age))
多个装饰器装饰一个函数
def outter2(func1):
def inner2(*args,**kwargs):
print("第一个装饰器 ~~~~1")
func1(*args,**kwargs)
return inner2
def outter3(func2):
def inner2(*args,**kwargs):
print("第二个装饰器 ~~~~1")
func2(*args,**kwargs)
return inner2
def outter3(func3):
def inner2(*args,**kwargs):
print("第三个装饰器 ~~~~1")
func3(*args,**kwargs)
return inner2
@outter1
@outter2
@outter3
def check():
print("check")
第一步:从下往上进行传参
@outter1
@outter2
@outter3
传参:
func3—》check 元 check-----》inner3
func2—》check(inner3) check-------》inner2
func2—》check(inner2) check-------》inner1
第二步:执行过程
check() -----》inner1()----》inner2()--------》inner3----》check原函数
工作原理:check一直修改指向的过程