装饰器的知识点储备:

1 作用域

2 高阶函数

3 闭包

内部函数,对外部作用作用域的变量进行了引用,该内部函数就认为是闭包,

def outer():

   x=10

  def inner():

    print(x)

  return inner   #inner 函数就是一个闭包,闭包函数可以脱离环境 调用

f = outer()

f()  这里还能找到 x变量

闭包:函数块+定义函数时的环境

###########

开放封闭原则

当一个函数已经实现了功能,且有很多模块都在调用的时候,一旦有新需求,一般不对该函数进行源代码修改,因为

如果产生问题会导致所有调用模块跟着出错,一般在外部进行功能扩展。

########

装饰器

##最开始思路:将计算时间单独设计一个函数,然后再计算那个函数的执行时间时,调用该函数。
############这样就改变了原始调用方法,原来都直接调用foo的,现在要调用show_time了,生产环境上忌讳这样做。
# import time
# def foo():
# print('foo....')
# time.sleep(2)
# def bar():
# print('bar....')
# time.sleep(3)
# def show_time(f):
# star_time = time.time()
# f()
# end_time = time.time()
# spend_time = end_time - star_time
# print(spend_time)
# show_time(foo)
###装饰器做法
import time
def show_time(f):
def inner():
star_time = time.time()
f()
end_time = time.time()
print('spend %s'%(end_time-star_time))
return inner @show_time #这个就是引用装饰器的标准写法,等同于foo = show_time(foo)
def foo():
print('foo.....')
time.sleep(2)
# foo = show_time(foo)
# foo() @show_time
def bar():
print('bar.....')
time.sleep(3)
# bar = show_time(bar)
# bar() foo()
bar()

############

装饰器的功能函数进行参数的定义,以及装饰器函数加参数来区分实现装饰器不同的功能调用。

def logger(flag): #定义装饰器函数
def show_time(f):
def inner(*x, **y):
star_time = time.time()
f(*x, **y)
end_time = time.time()
print('spend %s' % (end_time - star_time))
if flag == 'true': #设置条件,满足装饰器函数时会实现某个功能
print("logger is print")
return inner
return show_time
@logger('asdad') #调用装饰器函数时,参数不满足内里设置的条件,那么只调用装饰器里 计算程序运行的时间。
def foo():
print('foo.....')
time.sleep(2)
# foo = show_time(foo)
# foo() @logger('asdad')  #调用装饰器函数时,参数不满足内里设置的条件,那么只调用装饰器里 计算程序运行的时间。
def bar():
print('bar.....')
time.sleep(3)
# bar = show_time(bar)
# bar() @logger('true')  #调用装饰器函数时,参数满足内里设置的条件,那么不光调用装饰器里 计算程序运行的时间功能,还调用日志打印的功能。
def add(*a,**b):
sum = 0
for i in a:
sum += i
print(sum)
time.sleep(4) foo()
bar()
add(1,2,3,4,5)

最新文章

  1. 【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口
  2. 在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
  3. qq临时会话设置
  4. cpoint
  5. LeetCode-001 Two Sum
  6. Android进阶(十一)Android系统架构讲解
  7. 2019/4/19 wen 线程2
  8. [UE4]Grabbable接口
  9. VxWorks软件开发项目实例完全解析1-VxWorks简介
  10. 前端 HTML form表单标签 input标签 type属性 checkbox 多选框
  11. 通过IFeatureClass 接口查询 IWorkspace, 查询通配符
  12. 2018/03/10 每日一学PHP 之 修饰符 public/private/protected
  13. Java并发编程-核心问题(1)
  14. Linux嵌入式交叉编译环境 的搭建【转】
  15. @SpringContext通过实现ApplicationContextAware接口动态获取bean
  16. IDEA 配置SSH2
  17. SSH 无法启动的原因分析及解决方法
  18. iOS学习笔记09-核心动画CoreAnimation
  19. Android-Handler消息机制实现原理
  20. ng2自定义管道

热门文章

  1. 射线法(1190 - Sleepwalking )
  2. 关于Java中static关键字的用法以及从内存角度解析
  3. 动态的加载显示oracle警告日志文件内容
  4. 导出pip安装的所有放入一个文件中,并把通过这个安装所有的包
  5. eclipse如何更换工作空间
  6. js拼音排序
  7. Dapper+SqlServerCe部署
  8. .net基础学java系列(一)视野
  9. 为什么浏览器User Agent中都有个mozilla
  10. python url参数转dict