python三层装饰器-python 3层装饰器及应用场景
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: Changhua Gong
import time, functools
'''
实现装饰器:
1.函数即变量;
2.高阶函数;
1)把一个函数名当做实参传给另一个函数(在不修改被装饰函数的源代码情况下为其添加功能);
2)返回值中,包含函数名(不修改函数的调用方试)。
3.嵌套函数(在一个函数中,用def去声明另一个函数)。
原则:
1.不能修改被装饰的函数的源代码;
2.不能修改被装饰的函数的调用方试。
补:
1.函数在调用前,只要其涉及到的变量均在调用前别解释完全(无论先后顺序)
即可顺利执行。
'''
def timmer(func):
# @functools.wraps(func) #加上这个装饰后test的函数名就不是wrapper了,而是test,注意位置(http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000)
def wrapper(*args, **kv):
time_b = time.time()
return (func(*args, **kv))
time_e = time.time()
print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))
return wrapper # 注意这个return的位置
# 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator
@timmer # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题
# test(*args,**kv) = wrapper(*args,**kv)
def test():
print("Function test begins running.")
time.sleep(0.2)
print("Function test ends running.")
return "测试"
print("通过2层装饰器函数名更替为:%s" % test.__name__)
print(test())
print("-----------------------------------------")
def timmer(func):
#@functools.wraps(func)
def wrapper(*args, **kv):
time_b = time.time()
print("Begin calling.")
rs = func(*args, **kv) # 将函数返回值赋给rs
print("End calling.")
return rs # 这里返回函数执行完后的返回值
time_e = time.time()
print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))
return wrapper # 注意这个return的位置
# 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator
@timmer # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题
# test(*args,**kv) = wrapper(*args,**kv)
def test():
print("Function test begins running.")
time.sleep(0.2)
print("Function test ends running.")
return "测试"
print("通过2层装饰器函数名更替为:%s" % test.__name__)
print(test())
print("-----------------------------------------")
'''
上述装饰器都是简单的两层。
如果装饰器本身需要传入参数,则需要3层(应用场景如:登录网页使用微信、QQ、还是邮箱)。
'''
def login(login_type):
def timmer(func):
#@functools.wraps(func)
def wrapper(*args, **kv):
time_b = time.time()
if login_type == "QQ":
print("Login by QQ.")
return (func(*args, **kv))
else:
print("Login by Others.")
return (func(*args, **kv))
time_e = time.time()
print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))
return wrapper # 注意这个return的位置
return timmer # 注意这个return的位置
# 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator
@login("QQ") # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题
# test(*args,**kv) = wrapper(*args,**kv)
def test():
print("Function test begins running.")
time.sleep(0.2)
print("Function test ends running.")
return "测试"
print("通过3层装饰器函数名更替为:%s" % test.__name__)
print(test())
python三层装饰器-python 3层装饰器及应用场景相关推荐
- Python函数的装饰器,两层装饰器和三层装饰器
一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序,但是 ...
- python3层装饰器_python三层装饰器python字符串,数值计算
Python是一种面向对象的语言,但它不像C++一样把标准类都封装到库中,而是进行了进一步的封装,语言本身就集成一些类和函数,比如print,list,dict etc. 给编程带来很大的便捷 Pyt ...
- python装饰器两层和三层区别_学习python的第十五天(函数的装饰器,两层装饰器和三层装饰器)...
06.01自我总结 一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头 ...
- python三层装饰器-python三大神器===》装饰器
1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大"神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内 ...
- python三层装饰器-Python自动化开发学习4-装饰器
装饰器 通过装饰器可以为函数添加附加功能.通过修改函数本身也可以实现增加功能,但是通过装饰器还有下面2个好处.装饰器的2个原则:不改变被装饰函数的源代码 不改变被装饰函数的调用方式 遵循了上面2个原则 ...
- python三层装饰器-python3装饰器
python装饰器 预备知识 首先我们要知道在python,一切皆对象,函数也是一个对象 >>> def test(): ... return "Hello World&q ...
- python装饰器与闭包_Python 装饰器和闭包
Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...
- python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...
- python装饰器-Python——装饰器(Decorator)
1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...
最新文章
- Leetcode | Binary Tree Maximum Path Sum
- 2020秋季-人工神经网络课程报告
- yota3墨水屏设置_国产墨水屏“手写平板”评测,10.3英寸大屏,支持无纸化办公...
- BCB key事件中判断Shift、Alt、Ctrl状态
- 分子排列不同会导致_生物信息遇上Deep learning(7): ReLeaSE--强化学习做药物分子设计...
- 【测试点2分析】:1020 月饼 (25分)(甲级 1070 Mooncake (25 分))
- 线性代数及其应用_线性代数入门——行列式的简单应用选讲
- 数组 边界 检查的几种实现方法
- 值得收藏!UI设计学习借鉴常用网站
- 重新认识一遍JavaScript - 2
- Java基础语法之变量作用域、小大驼峰命名规则和java运算符(赋值、关系、三元、逻辑运算符)
- CVPR2022 | 移动端手部三维重建
- 数字图像处理_05_(图像锐化与边缘检测——Premittt算子、Roberts算子、Sobel算子、Scharr算子、Laplacian算子、LoG算子、Canny算子)
- read.html5.qq.com,从QQ浏览器缓存文件中提取出完整的视频
- 计算机检索的主要方法,计算机检索主要途径和方法
- 2022年要知悉的9大互联网前沿科技
- 【Redis笔记】缓存穿透与缓存击穿以及应对方法
- qtablewidget翻页禁止_PyQt—QTableWidget实现翻页功能
- C#实现批量生成条形码 ——主要用于准考证号的条形码生成
- 使用Dubbo实现简单的RPC调用(Spring配置文件版)