装饰器

装饰器概念
装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

装饰器形成的过程:最简单的装饰器 有返回值的 有一个参数的 有万能参数的
装饰器的作用
原则:开放封闭原则
语法糖
装饰器的固定模式
装饰器的应用场景举例
扩展自定义函数的功能,在不修改自定义函数的内容和调用方式时,实现扩展

例如:增加对fun()函数执行时长的统计,在不修改函数的调用方式和执行过程的前提下
最简单的装饰器

def timmer(f):  装饰器函数
    def inner(): 
        start = time.time()
        ret = f()     被装饰的函数
        end = time.time()
        print(end - start)
    return inner

def func(): 
    time.sleep(0.01)
    print ('hahahahaha')

func = timmer(func)
func()
带有返回值的装饰器,并且增加语法糖

def timmer(f):  装饰器函数
    def inner(): 
        start = time.time()
        ret = f()     被装饰的函数
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         语法糖 @装饰器函数名
def func():     紧挨着被装饰的函数名
    time.sleep(0.01)
    print ('hahahahaha')
    return '新年好'


func = timmer(func)    1、将func函数的内存地址传入timmer函数中的inner函数中
ret = func()           2、返回inner函数的内存地址给func
print (ret)            3、不改变func函数原始调用方式,但是内存地址是inner的
                       4、调用func,执行inner函数

不修改函数的调用方式,但是还想在原来的函数前后添加功能
timmer就是一个装饰器函数,只是对一个函数有一些装饰作用

原则:开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
1.对扩展是开放的
为什么要对扩展开放呢?

我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。
所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
为什么要对修改封闭呢?

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

装饰器完美的遵循了这个开放封闭原则。
装饰器带参数

def timmer(f):  装饰器函数
    def inner(*args,**kwargs): 
        start = time.time()
        ret = f(*args,**kwargs)     被装饰的函数
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         语法糖 @装饰器函数名
def func(a,b):     紧挨着被装饰的函数名
    time.sleep(0.01)
    print ('hahahahaha',a,b)
    return '新年好'

a = '1234567890'
b = '1233456789'
ret = func(a,b)
print (ret)

固定格式

def wrapper(f):  装饰器函数 f 被装饰的函数
    def inner(*args,**kwargs): 
        '''在被装饰函数之前要做的事'''
        ret = f(*args,**kwargs)     被装饰的函数
        '''在被装饰函数之后要做的事'''
        return ret
    return inner

@wrapper         语法糖 @装饰器函数名  func = wrapper(func)
def func(a,b):     紧挨着被装饰的函数名
    time.sleep(0.01)
    print ('hahahahaha',a,b)
    return '新年好'

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值