装饰器详解

装饰器Decorator Pattern

向已有的对象添加新的功能,同时又不改变其结构

目的:动态给一个对象添加新的功能,装饰器相比于生成子类更加灵活

解决:我们为了扩展一个类使用继承方式,导致子类很冗余。

优点:装饰类和被装饰类可以独立发展,不会相互耦合、

缺点:多层装饰比较复杂

使用场景:扩展一个类的功能,动态增加一个类的功能,和动态撤销

注意事项:可以代替继承

 

函数也是一个对象,因此可以将函数赋给变量

 

1.计算add()函数的时间

def add(a,b):
    res = a + B
    return res

一般写法

import time
def add(a,b):
    start_time = time.time()
    res = a + b
    exec_time = time.time()-start_time
    print(‘加法花费时间{}’.format(exec_time))
    return res

但是如果还要写一个计算减法的时间,可能也要写这么多,而且要逐步修改

import time
def sub(a,b):
    start_time = time.time()
    res = a - b
    exec_time = time.time()-start_time
    print(‘减法花费时间{}’.format(exec_time))
    return res

这样写代码的话就会感觉到很冗余,不灵活

因此我们引入装饰器

定义一个装饰器的写法

一般写一个装饰器可以参考这个模板

import time
#定义装饰器
def time_calc(func):
    def wrapper(*args,**kargs):
        Start_time = time.time()
        f = func(*args,**kargs) #这里是被装饰的函数,很重要
        ecex_time = time.time() - start_time
        return f
    return wrapper

使用装饰器案例

#使用装饰示例
@time_calc
def add(a,b):
    return a + b

@time_calc
def sub(a, b):
    Return a - b

这样看起来就好看多了,更pythonic了

 

参考资料1https://www.zhihu.com/question/26930016/answer/1047233982

参考资料2https://www.runoob.com/design-pattern/decorator-pattern.html

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值