14.python装饰器进阶之参数与返回值

一、带一个参数的装饰器

  • 上一节我们讨论的装饰器都是装饰不带参数的函数,现在要装饰一个带参数的函数怎么办呢?
def timer(func):
    def inner(a): # 参数a
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)

二、带多个参数的装饰器

  • 其实装饰带参的函数并不是什么难事,但假如你有两个函数,需要传递的参数不一样呢?
import time
def timer(func):
    def inner(*args,**kwargs): # 无论多少参数都能解决
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func1 = timer(func1)
def func1(a,b):
    print('in func1')

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func1('aaaaaa','bbbbbb')
print(func2('aaaaaa'))

三、有返回值的装饰器

  • 现在参数的问题已经完美的解决了,可是如果你的函数是有返回值的呢?
import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re  # 返回值
    return inner

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func2('aaaaaa')
print(func2('aaaaaa'))

四、functools wraps

  • 刚刚那个装饰器已经非常完美了,但是正常我们情况下查看函数的一些信息的方法在此处都会失效

查看函数信息的方式

def index():
    '''这是一个主页信息'''
    print('from index')

print(index.__doc__)    #查看函数注释的方法
print(index.__name__)   #查看函数名的方法
  • 为了不让函数信息失效,我们还要在装饰器上加上一点来完善它:
from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

@deco
def index():
    '''哈哈哈哈'''
    print('from index')

print(index.__doc__)
print(index.__name__)

五、 开放封闭原则

1.对扩展是开放的
  为什么要对扩展开放呢?
  我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
  为什么要对修改封闭呢?
  就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好想逃走啊能逃到哪里去呢 在生活的深渊里挣扎明明看见了光明却在黑暗里越陷越深 能逃到哪里去呢 如果有一天我不见了 ...
    livea阅读 1,313评论 0 0
  • 前几天有个很重要的客户,在签单那天的视频会议上发生了意外,直播、录制都发生失败,结果签单推迟了。更糟的是客户的创始...
    福莱得阅读 1,319评论 0 0
  • 又是一年年尾年头,以阳历算,年初我还在北京,在海淀,在天工大厦A座。年末却身在家乡,在南阳,在信臣东路88号。期间...
    南阳松林阅读 3,780评论 0 3
  • 1.由作者之生平,以知人论世,知为文时之背景。 2.探全篇之主题,以研索一篇之纲领。 3.明白全文之段落,以得每段...
    猫说心智教育糖糖老师阅读 2,801评论 0 0
  • 人啊,脆弱到什么地步了呢,脆弱到假装坚强,实则不堪一击
    俊俊雅阅读 1,488评论 0 0