博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 装饰器
阅读量:5320 次
发布时间:2019-06-14

本文共 2545 字,大约阅读时间需要 8 分钟。

在代码运行期间动态增加功能的方式,叫装饰器docorator

docorator 就是一个返回函数的高阶函数

 

# _*_ coding:utf-8 _*_ import functools import time # 编写装饰函数,在函数执行之前打印 call func.__name__ def log(func):#func是传入的函数,要执行的函数     @functools.wraps(func)#加这行是为了使返回的函数名变成func.__name__,不加这行的话返回的函数名是 wrapper.__name__     def wrapper(*args, **kw):         print('call %s():' % func.__name__)#在函数执行之前打印‘call func.__name__’         return func(*args, **kw)#执行func函数     return wrapper @log #在装饰函数之前加一个@来调用装饰函数,写在定义的函数now()的前面,那么在执行now()之前会先执行log()这个装饰函数 def now():     print('2015-3-25') f = now f()#调用now函数,相当于执行了语句 now= log(now) print(f.__name__) #如果docorator本身需要传入参数,函数如下,有3层的嵌套 def log(text):     def decorator(func):         @functools.wraps(func)         def wrapper(*args, **kw):             print('%s %s():' % (text, func.__name__))             return func(*args, **kw)         return wrapper     return decorator @log('execute') def now1():     print('2018-01-12') f1 = now1 f1() print(f1.__name__) # 请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间: def metric(fn):     @functools.wraps(fn)     def wrapper(*args, **kw):         start = time.time()         result = fn(*args, **kw)         end = time.time()         print('%s executed in %.2fs ms' % (fn.__name__, (end - start) * 1000))         return result     return wrapper @metric def now2(x, y):     time.sleep(1)     return (x + y) f = now2(10, 20) if f == 30:     print('pass') else:     print('failed') # 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志 def printBeginEndCall(fn):     @functools.wraps(fn)     def wrapper(*args, **kw):         print('begin call')         result = fn(*args, **kw)         print('%s() is executed at %s' % (fn.__name__, time.asctime(time.localtime())))         print('end call')         return result     return wrapper @printBeginEndCall def fast(num):     return (num ** 2) i = fast(3) print(i) #编写一个装饰函数,同时支持@log和@log(text) #这个代码存在问题,但是我不知道为什么 def log(t):     if isinstance(t, str):         def decorator(fn):             @functools.wraps(fn)             def wrapper(*args, **kw):                 print('%s %s()' % (t, fn.__name__))                 return fn(*args, **kw)             return wrapper         return decorator     else:         @functools.wraps(t)         def wrapper(*args, **kw):             print('%s() is executed' % t.__name__)             return t(*args, **kw)         return wrapper @log('start executing') def test(x):     return x ** 3 f = test(6) print(f) @log() def test2(y):     return (y ** 3) f1 = test2(10) print(f1)

转载于:https://www.cnblogs.com/xiaohai2003ly/p/8277456.html

你可能感兴趣的文章
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
深入理解基于selenium的二次开发
查看>>
较快的maven的settings.xml文件
查看>>
Git之初体验 持续更新
查看>>
软件开发模型之瀑布模型
查看>>
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
Python默认调用路径
查看>>
启动redis一闪就关
查看>>
Maven之setting.xml配置文件详解
查看>>
python简单小常识
查看>>
可视化框架设计-图表类型
查看>>
HDU1823 Luck ans Love 二维线段树
查看>>
富数据控件 DetailsView 和 FormView
查看>>
ASP.NET 4.5 Web Forms and Visual Studio vs2013年入门1
查看>>
JUC - ReentrantLock 的基本用法 以及 lock()、tryLock()、lockInterruptibly()的区别
查看>>
《那一世》
查看>>
迷你DVD管理器
查看>>