浅析装饰器
#开放 封闭 原则 #封闭,不要轻易改别人代码,完成额外的需求 #开放,不该接口,因为接口如果很多,太耗时了 def add(x,y): print(x+y)
#1. 要求在登录后才可以实现add功能 def login(x,y): user=input('user>>>>') pwd=input('pwd>>>>') if user=='amber' and pwd=='123': add(x,y)
login(3,5)
#2. 在别的函数的基础上 也加上登录功能 def login(func,x,y): user = input('user>>>>') pwd = input('pwd>>>>') if user == 'amber' and pwd == '123': func(x, y)
def mul(x,y): print(x*y)
login(mul,3,5)
#3.闭包函数 : 内层函数调用外层函数的环境变量,使外层函数的变量常驻内存,即使外界更改变量也不会受影响(安全) #4.利用闭包函数的特点,完成 开放原则,既不改变接口名,和接口调用方式,实现额外的功能
def login(func): def inner(x,y): user = input('user>>>>') pwd = input('pwd>>>>') if user == 'amber' and pwd == '123': func(x, y) #调用外层函数变量func return inner
#login(mul)即为inner mul = login(mul) #掉包 mul(3,5) #实现掉包 此时mul就是inner, 但是inner里的func还是原来的未改变的原生mul 利用闭包的安全特点,实现 开放封闭原则
#5.python的语法糖,@装饰器名,实现原理同上,但是不用写 mul=login(mul)了 @login def divide(x,y): print(x//y)
divide(3,1)
装饰器执行流程:
def outer(func): def inner(): print("222") ret = func() print("3333") return ret return inner @outer def f(): print("000") r = f() # 1、遇到outer函数放到内存 # 2、遇到@outer 执行outer函数,把@outer下面的函数名当做参数执行outer函数, # 3、把outer的返回值inner重新赋值给f # 4、现在执行f()就相当于执行inner # 5、执行inner,先print("222") # 6、再执行func ,这里的func是原来的函数f()既print("000") # 7、再执行print("333") # 8、返回一个原来函数的返回值r给inner就是现在的f