• 浅析装饰器


    #开放 封闭 原则
    #封闭,不要轻易改别人代码,完成额外的需求
    #开放,不该接口,因为接口如果很多,太耗时了
    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
  • 相关阅读:
    opencv 编译
    uniapp中使用xgplayer直播、讨论区的简单实现、第三方复制功能
    20192422李俊洁 实验八 Web安全
    PaddleSpeech 安装(ubuntu 20.04)并尝鲜其中的 TTS 功能
    webstorm 自动导入时始终使用单引号
    音视频字幕生成和翻译
    PaddleSpeech TTS 资料汇总
    vue中更新两个不相关组件的方法
    vue关闭ESlint
    两个数组 过滤出另一个数组中的值的方法
  • 原文地址:https://www.cnblogs.com/amber-liu/p/9930666.html
Copyright © 2020-2023  润新知