装饰器:

需求----> 写一个功能,测试其他同事函数的调用效率。  

第一版:功能版

import time

def func():
time.sleep(0.2)
print('非常复杂') def func1():
time.sleep(0.3)
print('超级复杂') # print(time.time())
start_time = time.time()
func()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))

第二版:函数版

import time
def func():
time.sleep(0.2)
print('非常复杂')
func()
def func1():
time.sleep(0.3)
print('超级复杂')
def timmer(f):
start_time = time.time()
f()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
timmer(func)
# timmer(func1)
# func()
func()
# 如果在实际项目中测试函数,
# 假如函数有1500个,那么你1500个timmer(func),工作量很大。
# 你要在不改变函数执行的指令下,同时测试效率。

第三版:在不改变被测函数的执行方式下,同时测试执行效率

import time

def func():
time.sleep(0.2)
print('非常复杂')
# func()
def func1():
time.sleep(0.3)
print('超级复杂') def timmer(f):
start_time = time.time()
f()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time)) timmer(func)
timmer(func1)
func()
f1 = func
func = timmer
func(f1) # timer(func)

装饰器的雏形:

import time
def func():
time.sleep(0.2)
print('非常复杂')
# func() def func1():
time.sleep(0.3)
print('超级复杂')
def timmer(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
return inner
# 语法糖 @
func = timmer(func)
func()
func1 = timmer(func1)
func1()

装饰器的优化: # timmer 就是装饰器: 在不改变原函数的调用指令情况下,给原函数增加额外的功能。

在被测函数上方@timmer 即添加装饰器。代码从上执行时,遇到@timmer 会往下走一层,相当于func = timmer(func)

import time

def timmer(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
return inner @timmer # func = timmer(func)
def func():
time.sleep(0.2)
print('非常复杂')
func()
@timmer # func1 = timmer(func1)
def func1():
time.sleep(0.3)
print('超级复杂')

装饰器基础进阶1:带参数的装饰器  #*args,**kwargs 万能传参

import time

def timmer(f):
def inner(*args,**kwargs): # 函数的定义: * 聚合。args = (1,2,3,434545,4234.)
# a1 = 'wusir'
# b1 = 'alex'
start_time = time.time()
f(*args,**kwargs) # 函数执行:* 打散。f(*(1,2,3,434545,4234.),)
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
return inner @timmer # func = timmer(func)
def func(a,b):
time.sleep(0.2)
print('非常复杂%s%s'% (a,b))
func('wusir','alex') # inner()

装饰器基础进阶2:有返回值的装饰器

import time

def timmer(f):  # f = func
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs) # func()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
return ret
return inner @timmer # func = timmer(func)
def func(a,b):
time.sleep(0.2)
print('非常复杂%s%s'% (a,b))
return 666
ret = func('wusir','alex') # inner()
print(ret) @timmer # func = timmer(func)
def func(a,b,c):
time.sleep(0.2)
print('非常复杂%s%s%s'% (a,b,c))
func('wusir','alex','barry') # inner()
装饰器用途:登录认证,打印日志等等。
总结:
其实装饰器本质是闭包,他的传参,返回值都是借助内层函数inner,
他之所以借助内层函数inner 就是为了让被装饰函数 在装饰器装饰前后,没有任何区别。
看起来没有变化。 装饰器的标准格式:
def auth(f): # f = func3函数名
def inner(*args,**kwargs): #万能传参
ret = f(*args,**kwargs)
return ret #返回值
return inner @auth
def comment():
print('欢迎来到评论页面')
comment()
												

Python初学者第二十三天 函数进阶(2)装饰器的更多相关文章

  1. python开发函数进阶:装饰器

    一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...

  2. python教程(三)·函数进阶(下)

    下半部分果然很快到来,这次介绍函数的更高级用法,装饰器! 函数嵌套 先来说说函数嵌套,python中的函数是可以嵌套的,也就是说可以将一个函数放在另一个函数里面,比如: >>> de ...

  3. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  4. Python进阶(六)----装饰器

    Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ​ 增加一些额外的新功能 封闭原则: ​ 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ​ 也可称装饰器函数,诠释开放封闭原则 ...

  5. Python函数篇:装饰器

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...

  6. python基础之函数当中的装饰器

    在实际工作当中存在一个开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...

  7. 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON

    关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...

  8. 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查

    内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...

  9. python语法生成器、迭代器、闭包、装饰器总结

    1.生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, ...

随机推荐

  1. Koa2实用入门

    koa2已发布了一段时间,可以考虑入手,参见Node.js最新Web技术栈(2016年4月) 本文主要是koa 2的文档解读和runkoa介绍,让大家对koa 2有一个更简单直接的理解 一.依赖Nod ...

  2. webapi找到了与该请求匹配的多个操作

    关于这个问题是路由在找方法的时候层没有指定对,同一个链接,同样的参数导致路由找不到方法导致的报错,可以在WebApiConfig中多配置一层,比如"api/{controller}/{act ...

  3. 2 字节的 UTF-8 序列的字节 2 无效 解决方法

    2 字节的 UTF-8 序列的字节 2 无效 解决方法: 用记事本打开xml文件,另存为 编码 选择 UTF-8,保存替换掉之前的文件,解决问题

  4. Spring boot --- Spring Oauth(三)

    本节将学习 spring security oauth  实现单点登录 概述 首先我们来了解什么是单点登录.看下面两张图就明白了. 很明显,单点登录最重要解决的就是登录和注销的功能,今天的例子,可以用 ...

  5. 【转】C#中continue、break和return用法

    continue和break的用法一样,直接写上这个单词,后面加一个分号就行 比如: continue; break; 我们先来谈continue 看代码 for (int i=0; i<10; ...

  6. Java的简单书写格式

    在一个java源代码中只能出现一个public类,而且必须跟文件名相同 在源代码的全局域类中只有 public 和 default 两种可见度 全局域不能写代码,只能定义类 成员类的构造方法和类的可见 ...

  7. java 数据脱敏

    所谓数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份 ...

  8. js小练习-移除数组中的元素

    移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回 代码: <!DOCTYPE HTML><html>    <he ...

  9. 用Struts2实现列表显示和分页功能

    引用自http://www.2cto.com/kf/201309/243730.html BlogDAO.java文件 /** 根据条件(默认一张表所有数据)返回多条记录 */ public List ...

  10. bootstrap-table 的必备参数

    1: 链接接口 url  请求的数据类型:dataType : "json"   后台请求方法 method  locale: 'zh-CN',//中文支持 pagination: ...