设为首页 加入收藏

TOP

复杂装饰器原理分析
2017-10-09 16:39:16 】 浏览:1596
Tags:复杂 装饰 原理 分析

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

 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这个函数理解成一个默认装饰器,这样你在调用这个默认装饰器时就可以为它选择先执行哪个函数最后执行哪个函数了!)

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python学习笔记07:自定义类型 下一篇埃尔米特插值问题——用Python进..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目