博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python函数四(装饰器进阶)
阅读量:4458 次
发布时间:2019-06-08

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

一。开放封闭原则

  1.对扩展是开放的

    任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

  2.对修改是封闭的

    比如我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了开放封闭原则。

二。函数的有用信息 

def func():    '''    本函数主要用于绘图,实时接收数据    :return:返回给前端某标签    '''    print(func.__doc__)    print(func.__name__)func()# 结果:# 本函数主要用于绘图,实时接收数据#     :return:返回给前端某标签# func

三。*args,**kwargs

def wrapper(func):    def inner(*args,**kwargs):        '''执行函数前'''        ret = func(*args,**kwargs)        '''执行函数后'''        return ret    return inner@wrapperdef func(a,b,c,d):      #接收函数时,加个*聚合    print(111)    func(1,2,3,4)# f1(*[1,2,3,4])        #执行函数时,加个*打散

四。装饰器进阶

  1.带参数的装饰器  

import timeflag = Falsedef timmer_out(f):    def timmer(func):        def inner(*args,**kwargs):            '''执行函数前操作'''            if f:                start_time = time.time()                time.sleep(0.3)                ret = func(*args,**kwargs)                '''执行函数后操作'''                end_time = time.time()                print('执行效率%s'%(end_time - start_time))                return ret            else:                ret = func(*args,**kwargs)                return ret        return inner    return timmer@timmer_out(flag)  # 1, timmer_out(flag)  返回 timmer  --->def f1():         # 2,  @timmer 就是你认识的装饰器 f1 = timmer(f1)    print(666)f1()
View Code

  2.多个装饰器装饰一个函数

def wrapper1(func):    def inner1(*args,**kwargs):        '''执行函数前'''        print(222)        ret1 =func(*args,**kwargs)        '''执行函数后'''        print(333)        return ret1    return inner1def wrapper2(func):    def inner2(*args,**kwargs):        '''执行函数前'''        print(555)        ret2 = func(*args,**kwargs)        '''执行函数后'''        print(666)        return ret2    return inner2@wrapper1@wrapper2def func():    print(111)func()#运行到@wrapper1时此时不运行,走下一步#运行到@wrapper2时,func = wrapper2(func),此时得到的是  func = wrapper2(func),返回值是inner2 ,即func---->inner2#之后再运行到@wrapper1,即func = wrapper1(inner2),返回值是inner1,即func----->inner1#接着调用func(),即调用inner1()# #再根据自上而下的运行规律即可以得到结果# 输出结果:# 222# 555# 111# 666# 333
View Code

 

    

转载于:https://www.cnblogs.com/zhuzhaoyang/p/8418988.html

你可能感兴趣的文章
P2664 树上游戏
查看>>
jQuery 停止动画
查看>>
Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
查看>>
MyBatis Generator去掉生成的注解
查看>>
教你50招提升ASP.NET性能(二十二):利用.NET 4.5异步结构
查看>>
lua连续随机数
查看>>
checkstyle使用介绍
查看>>
history.js 一个无刷新就可改变浏览器栏地址的插件(不依赖jquery)
查看>>
会了这十种Python优雅的写法,让你工作效率翻十倍,一人顶十人用!
查看>>
二维码图片生成
查看>>
在做操作系统实验的一些疑问
查看>>
Log4J日志配置详解
查看>>
NameNode 与 SecondaryNameNode 的工作机制
查看>>
Code obfuscation
查看>>
大厂资深面试官 带你破解Android高级面试
查看>>
node.js系列(实例):原生node.js实现接收前台post请求提交数据
查看>>
SignalR主动通知订阅者示例
查看>>
golang的表格驱动测试
查看>>
用python实现矩阵转置
查看>>
linux 小技巧(磁盘空间搜索)
查看>>