装饰器的知识点储备:

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)

python语法_装饰器的更多相关文章

  1. Python 语法糖装饰器的应用

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  2. python 语法之 装饰器decorator

    装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...

  3. python语法糖/装饰器

    1.python高阶函数和嵌套函数 1.1高阶函数 def func1(x): return x**2 def func2(x): return x**3 def func(x,y): return ...

  4. python语法32[装饰器decorator](转)

    一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...

  5. Python练习_装饰器、生成器_day12

    装饰器 装饰器篇: 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码. def login(func): def inner( ...

  6. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...

  7. python_语法糖_装饰器

    什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...

  8. python函数:装饰器、修正、语法糖、有参装饰器、global与nonlocal

    一.装饰器 二.装饰器修正1 三.装饰器修正2 四.装饰器的语法糖 五.有参.无参装饰器 六.global与nonlocal 一.装饰器 ''' 1 什么是装饰器 器=>工具 装饰=>指的 ...

  9. Python入门篇-装饰器

    Python入门篇-装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.装饰器概述 装饰器(无参) 它是一个函数 函数作为它的形参 返回值也是一个函数 可以使用@functi ...

随机推荐

  1. zabbix3.2利用自动发现功能对fastcgi模式的php状态进行集中监控

    zabbix3.2利用自动发现功能对fastcgi模式的php状态进行集中监控 前端nginx虚拟主机引用后端多个php接口,为了方便监控,将后端服务器集中配置在nginx中,具体配置如下: [roo ...

  2. CSS div内文字显示两行,超出部分省略号显示

    1. 概述 1.1 说明 在项目过程中,有时候需要控制div内文字最多显示两行,超出的使用省略号进行处理.使用识别码/前缀-webkit进行处理可直接得到相应效果. 1.1 -webkit WebKi ...

  3. identifier of an instance of **** was altered from **** to *****

    在用hibernate getSession().save(entity)方法保存数据库表实体类的时候报这个异常 我的需求是一个请求要往数据库表插两条数据,根据传值判断做了for循环调两次save() ...

  4. Jmeter(1)介绍

    JMeter是什么东西 Jmeter(Apache JMeter)是一个100%基于JAVA的应用程序,它的功能是 分析和衡量 web应用程序和各种服务的性能和负载能力 Jmeter不是一个浏览器,它 ...

  5. tensorflow卷积神经网络-【老鱼学tensorflow】

    前面我们曾有篇文章中提到过关于用tensorflow训练手写2828像素点的数字的识别,在那篇文章中我们把手写数字图像直接碾压成了一个784列的数据进行识别,但实际上,这个图像是2828长宽结构的,我 ...

  6. spark ML pipeline 学习

    一.pipeline 一个典型的机器学习过程从数据收集开始,要经历多个步骤,才能得到需要的输出.这非常类似于流水线式工作,即通常会包含源数据ETL(抽取.转化.加载),数据预处理,指标提取,模型训练与 ...

  7. 随笔【js】

    1.js是大小写敏感的 2. 区别 getElementBy ID , getElementsBy Name,  getElementsBy TagName以人来举例说明,人有能标识身份的身份证,有姓 ...

  8. 我的BO之强类型

    弱类型的缺点 有些程序员对类型比较随意,从前端传来的数据,不管应该是什么类型,都以String接收.然后在什么地方转成应该有的类型则要"看心情",在Controller, Serv ...

  9. Linux-day2-pdf课件

    1.Linux文件属性和权限 2.Linux重定向 3.Linux文件查找 4.Linux压缩打包 5.课堂作业 权限相关作业: 题目创建用户carol,ivy,jenny,kevin,alice创建 ...

  10. SpringBoot使用prometheus监控

    本文介绍SpringBoot如何使用Prometheus配合Grafana监控. 1.关于Prometheus Prometheus是一个根据应用的metrics来进行监控的开源工具.相信很多工程都在 ...