装饰器:

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

第一版:功能版

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. JAVA 之 多态 抽象 接口

    一:多态  1:多态   一个对象有多种形式的能力 2:步骤 1编写父类派生子类 2子类重写父类方法 3用父类的数据类型引用子类对象 3:静态多态的实现方式就是方法重载 4:动态多态的实现方式就是重写 ...

  2. json 只能用 for-in 遍历

    [JS] var json1 = { 'name' : 'yy' , 'age' : 11 , 'fun' : '前端开发' }; for( var attr in json1 ) { alert( ...

  3. css3的overflow-anchor

    overflow-anchor属性使我们能够选择退出滚动锚定,这是一个浏览器特性,旨在允许内容在用户当前的DOM位置上加载,而不需要在内容完全加载后更改用户的位置. 为何要有这个属性? 滚动锚定是一种 ...

  4. Vue教程:windows下安装npm和cnpm

    [安装步骤] 一.安装node.js 1.前往node.js官网下载并安装工具,这里安装路径选到D盘,D:\Program Files\nodejs 安装完毕在命令行输入以下命令测试是否安装成功,正确 ...

  5. JS中的拖动之—— ondragstart,ondrag,ondragend , ondragenter , ondragover , ondragleave, ondrop 的区别

    关于 HTML5 中的拖动功能. 更多信息可以查看我们 HTML 教程中的 HTML5 拖放.以下 我只做一下简介. 1 如果你想让元素变得可拖动,首先 你得对元素设置 draggable 属性 此属 ...

  6. activemq控制面板含义

    Name 消息队列的名称 Number Of Pending Messages 等待消费的消息数量,即未出队列的消息数量.可以理解为总接收数-总出队列数 (未持久化的话,重启acmq后会清零) Num ...

  7. jade——创建第一个jade模板

    什么是jade? jade是node.js的一个模板引擎,参考了haml的语法,是简写的html语言. 使用单个标签代替双标签,类似于Python,通过缩进来确定从属关系,没有结束符号,非常简洁,使用 ...

  8. [javaSE] 网络编程(TCP通信)

    客户端A与服务端建立通信,服务端获取到客户端A的Socket对象,通过这个通路进行通信 客户端: 获取Socket对象,new出来,创建客户端的Socket服务,构造参数:Sting主机,int 端口 ...

  9. 数据库状态标识位flag设计

    设计目的 减少各种状态值字段 减少数据库冗余和存储空间 增加状态值时可灵活调整,无需增加额外字段 运用场景 例子1:管理用户的支付方式 比如针对不同用户组设置了不同的支付方式支持,假设支付方式有支付宝 ...

  10. Centeros7下安装Mysql 2018最新版,非常简单

    下载Mysql的rpm安装包 shell> wget http://dev.mysql.com/get/ mysql-community-release-el7-5.noarch.rpm安装sh ...