装饰器

Posted 不会起名字

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

装饰器的本质:一个闭包函数

装饰器的功能:在不修改原函数及其调用方式的情况下对原函数的功能镜像扩展

语法糖:

技术分享
 1 import time
 2 def timer(func):
 3     def inner():
 4         start = time.time()
 5         func()
 6         print(time.time() - start)
 7     return inner
 8 @timer   #==> func1 = timer(func1)   ===>语法糖
 9 def func1():
10     print(in func1)
11 func1()
12 
13 装饰器——语法糖
View Code

开放封闭原则:对扩展开放,对修改封闭

1.对扩展是开放的

    为什么要对扩展开放呢?

    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

  2.对修改是封闭的

    为什么要对修改封闭呢?

    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了这个开放封闭原则。

装饰器的主要功能和固定格式:

功能:在不改变函数的调用方式的基础上在函数前后添加某些功能

固定格式:

技术分享
1 def timer(func):
2     def inner(*args,**kwargs):
3         ‘‘‘执行函数之前要做的‘‘‘
4         re = func(*args,**kwargs)
5         ‘‘‘执行函数之后要做的‘‘‘
6         return re
7     return inner
固定万能格式

带参数的装饰器:

技术分享
 1 def outer(flag):
 2     def timer(func):
 3         def inner(*args,**kwargs):
 4             if flag:
 5                 print(‘‘‘执行函数之前要做的‘‘‘)
 6             re = func(*args,**kwargs)
 7             if flag:
 8                 print(‘‘‘执行函数之后要做的‘‘‘)
 9             return re
10         return inner
11     return timer
12 @outer(False)
13 def func():
14     print(111)
15 func()
View Code

多个装饰器修饰同一个函数:

技术分享
 1 def wrapper1(func):
 2     def inner():
 3         print(wrapper1 ,before func)
 4         func()
 5         print(wrapper1 ,after func)
 6     return inner
 7 def wrapper2(func):
 8     def inner():
 9         print(wrapper2 ,before func)
10         func()
11         print(wrapper2 ,after func)
12     return inner
13 @wrapper2
14 @wrapper1
15 def f():
16     print(in f)
17 f()
View Code

 

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码