zoukankan      html  css  js  c++  java
  • 复杂装饰器原理分析

    在弄复杂装饰器之前我们先温习一下简单的装饰器,代码如下:

     1 #简单装饰器温习
     2 def zhuangshiqi(main):
     3     def nei(*args,**kwargs):
     4         print("验证!")
     5         return  main(*args,**kwargs)
     6     return nei
     7 
     8 @zhuangshiqi
     9 def zhu():
    10     print("Welcome!")
    11     return 12
    12 zhu()

    这段代码的意思就是从@符号开始,代码真正开始执行,

    @符号后接的是装饰器的函数名,那么装饰器便执行了,

    并将@下方的主函数的函数名当做一个参数传给了装饰器,之后返回了一个nei,

    这时候返回的这个nei会赋给@下方的主函数zhu这个函数名,那么就相当于zhu=nei,之后执行zhu()的时候,

    实际上是执行了nei(),nei的内部代码便执行了,打印了“验证!”,之后执行参数函数,并返回参数函数的返回值,代码便运行完毕了。

    接下来咋们看看复杂一点的装饰器,代码如下:

     1 #复杂装饰器
     2 def loading():
     3     print("第一种登录方式!")
     4 
     5 def loading1():
     6     print("第二种登录方式!")
     7 
     8 def error():
     9     print("第一种错误检查方式!")
    10 
    11 def error1():
    12     print("第二种错误检查方式!")
    13 
    14 
    15 def yanzheng(han1,han2):
    16     def zhuangshiqi1(main):
    17         def nei(*args,**kwargs):
    18             a=han1(*args,**kwargs)
    19             if a != None:
    20                 return a
    21             b=main(*args,**kwargs)
    22             if b != None:
    23                 return b
    24             c=han2(*args,**kwargs)
    25             if c != None:
    26                 return c
    27         return nei
    28     return zhuangshiqi1
    29 
    30 @yanzheng(loading,error)
    31 def jiekou1():
    32     print("Welcome!")
    33 
    34 @yanzheng(loading1,error1)
    35 def jiekou2():
    36     print("Welcome!")
    37 
    38 jiekou1()
    39 jiekou2()

    这段代码就是,我先定义了4个函数,分别是两种登录方式和两种错误检查方式,加一个复杂装饰器,

    接下来从@符号开始,代码真正开始执行,大家仔细看,@符号后接得是啥,是一个带两个参数的函数,

    而且加括号了对不对,那么这个函数便执行了,并且把两个参数传进去了,还返回了一个zhuangshiqi1,

    这时候就相当于是@zhuangshiqi1,@符号后是不是接了一个函数名,那么这个函数你可以理解成上面那个

    简单的装饰器了,之后便是直接执行zhuangshiqi1,并将@下方的主函数的函数名当做一个参数传给了装饰器,之后返回了一个nei,

    这时候返回的这个nei会赋给@下方的主函数的函数名,那么就相当于主函数的函数名=nei,

    之后执行主函数()的时候,实际上是执行了nei(),nei的内部代码便执行了,先执行之前传进去的第一个参数对应的函数,

    接着执行参数函数,最后执行之前传进去的第二个参数对应的函数,代码便执行完毕了。

    (你可以将yanzheng这个函数理解成一个默认装饰器,这样你在调用这个默认装饰器时就可以为它选择先执行哪个函数最后执行哪个函数了!)

    最后附上复杂装饰器运行结果:

  • 相关阅读:
    Android Watchdog
    Android Zygote进程是如何fork一个APP进程的
    java多线程面试题小结
    Java Socket通信以及可能出现的问题解决
    Java对象的浅拷贝和深拷贝&&String类型的赋值
    AtomicLong和LongAdder的区别
    JDK中Concurrent包介绍及使用(包含atomic包/lock包/并发容器/执行器)
    final关键字总结
    Java内存模型-final域的内存语义--没明白,预留以后继续理解
    synchronized底层实现原理&CAS操作&偏向锁、轻量级锁,重量级锁、自旋锁、自适应自旋锁、锁消除、锁粗化
  • 原文地址:https://www.cnblogs.com/breakering/p/6100973.html
Copyright © 2011-2022 走看看