python基础-装饰器
什么是装饰器
# 概念:就是接受一个函数不改变里面的代码,进行包裹,然后返回函数的一个工具;不改变原函数调用方法的,对原函数进行包裹附加功能的工具
# 原理:利用高阶函数可以接受函数作为参数,返回函数作为结果实现迭代器
# 功能:极大的简化代码,避免编写重复性代码函数
# 本质:高阶函数# @装饰器名字:等价于 f = decorate(f)。
# *args-**kw:要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用。# 打印日志:@log
# 用户验证:@auth
# 检测性能:@performance
# 数据库事务:@transaction
# URL路由:@post('/register')
无参数装饰器:就是没有参数的装饰器,一般两层包裹
# 无参数装饰器,
# 由于decorator返回的新函数函数名已经不是'factorial',而是@log内部定义的'wrapper'。
# 这对于那些依赖函数名的代码就会失效。decorator还改变了函数的 __name__,__doc__等其它属性。
# 如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中:
# Python内置的functools可以用来自动化完成这个“复制”的任务:
def log(f):def wrapper(*args,**kwargs):ret = f(*args,**kwargs)print("call "+f.__name__)return retreturn wrapper
@log
def factorial(n):return reduce(lambda x,y:x*y,range(1,n+1))result = factorial(3)
print('result',result)f = log(factorial)(3)
print('f',f)# 打印执行时间
import time
def performance(f):def wrapper(*args,**kwargs):start = time.time()ret = f(*args,**kwargs)end = time.time()print('call %s() in %f'%(f.__name__,end-start))return retreturn wrapper@performance
def factorial(n):return reduce(lambda x,y: x*y, range(1, n+1))print(factorial(10))
有参装饰器:就是有参数的装饰器,一般三层包裹
# 有参数装饰器,三层函数
def log1(n):print(n*1000)def outer(f):def wrapper(*args,**kwargs):ret = f(*args,**kwargs)print("call "+f.__name__)return retreturn wrapperreturn outer
@log1(8)
def factorial(n):return reduce(lambda x,y:x*y,range(1,n+1))result = factorial(3)
print(result)f = log1(8)(factorial)(3)
print(f)# 内部返回函数名(参数),返回函数名,返回函数名
# 以下是返回的__name__
import time, functools# 没有加@functools.wraps(f):
def performance(unit):def f(f):def wrapper(*args, **kwargs):t1 = time.time()ret = f(*args, **kwargs)t2 = time.time()if unit == 's':print("call %s() in %s" % (f.__name__, t2 - t1))else:print("call %s() in %s" % (f.__name__, 1000 * (t2 - t1)))return retreturn wrapperreturn f
@performance('ms')
def factorial(n):return reduce(lambda x, y: x * y, range(1, n + 1))
print("没有加@functools.wraps(f):",factorial.__name__)# 有加@functools.wraps(f):
def performance(unit):def f(f):@functools.wraps(f)def wrapper(*args, **kwargs):t1 = time.time()ret = f(*args, **kwargs)t2 = time.time()if unit == 's':print("call %s() in %s" % (f.__name__, t2 - t1))else:print("call %s() in %s" % (f.__name__, 1000 * (t2 - t1)))return retreturn wrapperreturn f
@performance('ms')
def factorial(n):return reduce(lambda x, y: x * y, range(1, n + 1))
print("有加@functools.wraps(f):",factorial.__name__)
# 就是在里面的函数外加个@functools.wraps(函数名的参数名)
如何使用两种:原函数和新装饰器函数
def outer(f):def wrapper(*args,**kwargs):ret=f(*args,**kwargs)print("hello2:",*args)return retreturn wrapper@outer
def foo(name):print("hello:",name)
foo("adamanter")def wrapper(fn):def inner():print("wrapped")fn()inner.raw = fnreturn inner@wrapper
def foo():print("go")if __name__ == '__main__':# 被装饰的foo()print("--------")# 没被装饰的foo.raw()
转载于:https://www.cnblogs.com/adamans/articles/7495523.html
python基础-装饰器相关推荐
- python基础装饰器_Python基础 装饰器及练习
Python视频教程讲解装饰器 推荐免费:Python视频教程 装饰器概念 装饰器,说白了,就是用来装饰函数的一个函数. 装饰器遵循 开放封闭原则.依赖倒置原则,这两个原则概念,自行百度下, 装饰器长 ...
- python修饰器classmate_[python基础]装饰器、迭代器、生成器
装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象 它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...
- day5学python 基础+装饰器内容
基础+装饰器内容 递归特性# 1.必须有一个明确的结束条件# 2.每次进入更深一层递归时,问题规模相比上次递归应有所减少# 3.递归效率不高 def run(n):print(n)if int(n/2 ...
- python基础装饰器(二十)
简单装饰器的代码展示: def test1(x):return x * xdef test2(x):return x + 2 * xdef demo(f):def test(x):print(f.__ ...
- Python之装饰器
Python之装饰器 在不修改函数调用方式的前提下,也不能修改函数内部源代码!!!! 例如: 在每个季度公司发绩效,统计每个人的代码执行效率.咱们总不能是每个函数里加time模块吧. import t ...
- Python的装饰器
详解Python的装饰器 本文源码 https://github.com/tobyqin/python_decorator Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都 ...
- python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...
- python装饰器函数-Python精进-装饰器与函数对象
本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...
- python turtle画气球-如何用python的装饰器定义一个像C++一样的强
如何用python的装饰器定义一个像C++一样的强 Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.使用python的装饰器来定义一个像C++那 ...
- python装饰器函数-Python函数装饰器常见使用方法实例详解
本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...
最新文章
- sketch如何做设计稿交互_做交互设计不可不知的十大原则
- go语言笔记——多值函数,本质上和nodejs的回调很像,不过nodejs是回调的第一个参数是err,而golang里是第二个!...
- 安徽大学大一高数第二章习题册答案
- 数据结构实验之二叉树三:统计叶子数
- android除去标题栏或全屏
- Android教程之android平台水波效果!提供源码!
- 深度推荐系统2019年度阅读收藏清单
- 计算机组成原理 多级中断,计算机组成原理的大神们能不能帮忙做几道题啊
- mysql_连接查询
- moxa串口服务器网页版用户名密码,moxa串口服务器设置密码
- HttpStatus详解
- 视频像素、分辨率、清晰度关系及区别
- uni-app 常用内容
- 关于Java八种原始数据类型
- 火箭双杀尼克斯 哈林组合和砍50分
- 『淘宝十年技术路』读后想法
- 【WPF、UWP】搜索蓝牙设备
- 计算机在制造业中的应用领域是什么,计算机在制造业中的应用ppt
- C++实现X11桌面录屏为H264文件
- 硬盘突然变raw格式_磁盘分区变成RAW格式怎么办?手把手教你解决方法