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
  • 相关阅读:
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    449. Serialize and Deserialize BST
    114. Flatten Binary Tree to Linked List
    199. Binary Tree Right Side View
    173. Binary Search Tree Iterator
    98. Validate Binary Search Tree
    965. Univalued Binary Tree
    589. N-ary Tree Preorder Traversal
    eclipse设置总结
  • 原文地址:https://www.cnblogs.com/amber-liu/p/9930666.html
Copyright © 2011-2022 走看看