python函数-装饰器

1.装饰器的原则--开放封闭原则

开放:对于添加新功能是开放的

封闭:对于修改原功能是封闭的

2.装饰器的作用

在不更改原函数调用方式的前提下对原函数添加新功能

3.装饰器的本质--闭包

4.装饰器

  (1)简单的装饰器

def deco(f):
def wrapper():
"""原函数前添加的功能"""
f()
"""原函数后添加的功能"""
return wrapper def func():
print('这是原函数!') func = deco(func)
func()

  (2)装饰器的语法糖-----@deco

def deco(f):
def wrapper():
"""原函数前添加的功能"""
f()
"""原函数后添加的功能"""
return wrapper @deco # ——>此处效果等同于 func = deco(func)
def func():
print('这是原函数') func()

  (3)带返回值的装饰器

def deco(f):
def wrapper():
"""原函数前添加的功能"""
res = f()
"""原函数后添加的功能"""
return res
return wrapper @deco
def func():
print('这是原函数')
func()

  (4)装饰器加参数的固定格式

def deco(f):
def wrapper(*args,**kwargs):
"""原函数前添加的功能"""
res = f(*args,**kwargs)
"""原函数后添加的功能"""
return res
return wrapper @deco
def func(*args,**kwargs):
print('这是原函数')
func()

  (5)装饰器的固定格式--wraps版

from functools import wraps

def wrapper(func):
@wraps(func)
def inner(*args,**kwargs):
print('在被装饰的函数执行之前做的事')
ret = func(*args,**kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner
@wrapper
def holiday(day):
print("新年快乐")
return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)
print(ret) >>>>
holiday
None
在被装饰的函数执行之前做的事
新年快乐
在被装饰的函数执行之后做的事
好开心

  

(6) 多个装饰器装饰一个函数 

def wrapper1(func):
def inner1():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
return inner1 def wrapper2(func):
def inner2():
print('wrapper2 ,before func')
func()
print('wrapper2 ,after func')
return inner2 @wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2
@wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1
def f():
print('in f') f() >>>>
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func

  

  

最新文章

  1. (转载)SQL去除回车符,换行符,空格和水平制表符
  2. Dojo框架学习笔记<一>
  3. [转]Java 征途:行者的地图
  4. {Reship}{Matting}Image Matting
  5. 扩展easyui 的表单验证
  6. ANT自动打包U3D安卓项目研究笔记
  7. [C#]Attribute特性(2)——方法的特性及特性参数
  8. js将map转换成数组
  9. .NET多线程执行函数
  10. ng-cookie 的基本使用
  11. MyEclipse6.5安装SVN插件的三种方法
  12. AIX-vi操作-提示Unknown terminal type的问题解决方法
  13. Java面试12|Linux及Shell脚本
  14. Hexo 搭建博客 本地运行 常见报错及解决办法
  15. linux的PAM认证和shadow文件中密码的加密方式
  16. NHibernate 有好几种数据库查询方式
  17. LARC Caffe笔记(二) 训练自己的img
  18. Linux学习杂记
  19. python学习_条件判断语句_if
  20. LoadRunner中Vugen-Recording Options选项卡介绍:

热门文章

  1. Mybatis注解开发单表CRUD
  2. Windows和linux命令行快捷键
  3. vs2010编译C++ 对象的使用
  4. Visual Studio中的“build”、“rebuild”、“clean”的区别
  5. JS写一个旋转木马的视频播放效果
  6. Manjaro Linux 添加源及输入法
  7. ubuntu18.04下载yarn
  8. Day 26:Dom4j修改xml
  9. LeetCode1217 玩筹码(贪心)
  10. P1051复数乘法