浅析装饰器

#开放 封闭 原则
#封闭,不要轻易改别人代码,完成额外的需求
#开放,不该接口,因为接口如果很多,太耗时了
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

 

posted @ 2018-11-08 17:59  amberLIU  阅读(127)  评论(0编辑  收藏  举报