zoukankan      html  css  js  c++  java
  • 浅析装饰器

    #开放 封闭 原则
    #封闭,不要轻易改别人代码,完成额外的需求
    #开放,不该接口,因为接口如果很多,太耗时了
    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
  • 相关阅读:
    4. 变量
    3.进制的转换
    2 java程序入门
    truncate/delete/drop 区别
    sql server查询优化方法(海量数据)
    C#将DataTable转化成数组
    jq获取表格同一行第一列的内容
    C#将时间格式由yyyyMMdd转化成yyyy-MM-dd
    Easyui改变单元格背景颜色和字体颜色
    js判断数组中是否含有某元素(indexOf/includes)
  • 原文地址:https://www.cnblogs.com/amber-liu/p/9930666.html
Copyright © 2011-2022 走看看