装饰器的作用 —— 不想修改函数的调用方式 但是还想在原来的函数前后添加功能
原则: 开放封闭原则     开放 : 对扩展是开放的   封闭 : 对修改是封闭的
# timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用
 1 import time
 2 def timmer(f):    #装饰器函数
 3     def inner():
 4         start = time.time()
 5         f()       #被装饰的函数
 6         end = time.time()
 7         print(end - start)
 8     return inner
 9
10 @timmer         #语法糖 @装饰器函数名
11 def func():     #被装饰的函数
12     time.sleep(0.01)
13     print('老板好同事好大家好')
14     return '新年好'
15  #inner
16 #func = timmer(func)
17 ret = func()   #inner()
18 print(ret)

装饰带参数函数的装饰器
def timmer(f):    #装饰器函数def inner(*args,**kwargs):#(1,2) /(1)start = time.time()ret = f(*args,**kwargs)  #f(1,2)       #被装饰的函数end = time.time()print(end - start)return retreturn inner@timmer         #语法糖 @装饰器函数名
def func(a,b):     #被装饰的函数time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好'

装饰器的固定模式
def wrapper(f):    #装饰器函数,f是被装饰的函数def inner(*args,**kwargs):'''在被装饰函数之前要做的事'''ret = f(*args,**kwargs)    #被装饰的函数'''在被装饰函数之后要做的事'''return retreturn inner@wrapper         #语法糖 @装饰器函数名
def func(a,b):     #被装饰的函数time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好'  

装饰器进阶 
带参数的装饰器
#500个函数统一import time
FLAG=False
def time_out(FLAGE):def timmer(f):    #装饰器函数def inner(*args,**kwargs):#(1,2) /(1)if FLAGE:start = time.time()ret = f(*args,**kwargs)  #f(1,2)       #被装饰的函数end = time.time()print(end - start)return retelse:ret = f(*args, **kwargs)  # f(1,2)return retreturn innerreturn timmer@time_out(FLAG)      #语法糖 @装饰器函数名
def func(a,b):     #被装饰的函数time.sleep(0.01)print('老板好同事好大家好',a,b)return '新年好'func(2,3)

 多个装饰器装饰一个函数

 

#多个装饰器装饰一个函数
def wrapper1(func):def inner1():print('wrapper1 ,before func')ret = func()print('wrapper1 ,after func')return retreturn inner1
def wrapper2(func):def inner2():print('wrapper2 ,before func')ret = func()print('wrapper2 ,after func')return retreturn inner2
def wrapper3(func):def inner3():print('wrapper3 ,before func')ret = func()print('wrapper3 ,after func')return retreturn inner3@wrapper3
@wrapper2
@wrapper1
def f():print('in f')return '哈哈哈'print(f())
###
wrapper3 ,before func
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func
wrapper3 ,after func
哈哈哈

  wraps的用法

from functools import wraps
def wrapper(func):  #func = holiday@wraps(func)def inner(*args,**kwargs):print('在被装饰的函数执行之前做的事')ret = func(*args,**kwargs)print('在被装饰的函数执行之后做的事')return retreturn inner@wrapper   #holiday = wrapper(holiday)
def holiday(day):'''这是一个放假通知'''print('全体放假%s天'%day)return '好开心'print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)   #inner
print(ret)

  

 
 

转载于:https://www.cnblogs.com/olivia2018/p/8137505.html

python 装饰函数相关推荐

  1. Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能

    Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能 目录

  2. python函数装饰函数_Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  3. python 装饰器 二 (装饰带参数的函数)

    #!/usr/bin/env python #_*_coding=utf-8_*_ #Author: xieyixue #mail: xyx_0410@163.com #Created Time: 2 ...

  4. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  5. python装饰器实例-Python函数装饰器--实例讲解

    一.装饰器定义: 1.装饰器的本质为函数: 2.装饰器是用来完成被修饰函数的附加功能的 所以:装饰器是用来完成被修饰函数附属功能的函数 装饰器的要求: 1.不能修改被修饰函数的源代码: 2.不能更改被 ...

  6. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  7. python装饰器函数-python函数装饰器

    什么是装饰器 装饰器是一个可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会: 1,处理被装饰的函数,然后把它返回 2,将其替换成另一个函数或者对象 若有个名为decorate的装饰器,则 ...

  8. python装饰器函数-【python3】 函数 装饰器

    第一步 : 了解装饰器 装饰器模式,重点在于装饰,装饰的核心仍是被装饰的对象. 举一个栗子:我今天穿了一件短袖,但是突然一阵风,短袖没办法为我御寒,我想到的办法是将短袖变得更厚更长,但是改造之后,它就 ...

  9. python装饰器函数-python装饰器1:函数装饰器详解

    先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了 ...

最新文章

  1. endnote咋手动输入文献_EndNote 如何在 Word 中手动输入引文
  2. 项目怎么查服务器,服务器查询项目标签
  3. 沉没成本(要不要买房)
  4. mysql中对象标识符的命名规则,标准规范数据库命名规范.doc
  5. EularProject 39:给周长推断构成直角三角形个数
  6. python 操作微信闪电贷款_16、6个能够让Python程序快如闪电的小技巧
  7. 深入理解jsonp跨域请求原理
  8. 文件不存在的话创建文件 文件上传所遇到的问题、
  9. 很累很失败,发奋学英语
  10. 电驴搜索服务器正在连接,电驴连接不上服务器导致无法搜索解决的方法介绍
  11. 小说APP源码—小说app开发如何做到小说APP系统快速搭建?
  12. Word中搜狗输入法不管用了怎么办?
  13. Qt系列文章之 QAbstractItemModel(上)
  14. 【51nod 1538】一道难题(常系数齐次线性递推)
  15. 名帖299 王铎 行书《书法册页李贺诗四首》
  16. Docker的基本使用
  17. A股实践 :图神经网络与新闻共现矩阵策略(附代码)
  18. 不得不看的Python入门知识
  19. 费雪MOGAFX方程式是什么? -
  20. 面试积累-Redis-Redis主要消耗什么物理资源?

热门文章

  1. pipenv 虚拟环境新玩法
  2. [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?
  3. java中的神奇this
  4. ubuntu14.04 下emacs 24 配置
  5. loadrunner 场景设计-负载生成器管理
  6. Java 之文件目录操作
  7. linux下的c编程
  8. jquery总结_代码收藏
  9. ansible-playbook 手工编译安装nginx
  10. 七牛云智能日志管理平台正式发布