day 11 - 1 装饰器

装饰器

装饰器形成的过程 : 最简单的装饰器——有返回值的——有一个参数——万能参数
装饰器的作用:不想修改函数的调用方式 但是还想在原来的函数前后添加功能
原则 :开放封闭原则
语法糖 :@装饰器函数名
装饰器的固定模式

原则:开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的

首先我们来逐步实现这么一个功能吧

计算代码运行的时间

#先来看下需要的组件
import time  #time 模块

time.time()       #获取当前时间
time.sleep(5)      #让程序睡眠多少时间

print(time.time()) #来试下

我们来写一个可以计算时间的函数

def func():
    start=time.time()
    time.sleep(0.1)   #时间太短 系统会显示 0.0,所以我们让他休眠 0.1s
    print("计算程序执行的时间")
    end=time.time()
    print(end-start)

func()

但是这里有一个问题:如果要计算很多函数的运行时间,那不是要在函数中都加上几行计算的代码,这显然是不可行的,一般写好的没问题的函数,是不会去对它进行修改,而且还很麻烦

所以这里我们写一个计算时间的函数独立出来

def times(f):
    start=time.time()
    time.sleep(0.1)
    f()
    end=time.time()
    print(end-start)


def func():
    print("计算程序执行的时间")


def func2():
    print(time.sleep(5))

times(func)
times(func2)

但是这样貌似还有一个问题,我要计算时间的函数只能一个一个的运行,或者写 n 个 time() 来调用

接着我们来了解下装饰器吧,解决这样的问题

先来写一个简单的装饰器

#待完善

装饰器的固定模式

def wrapper(f):     #装饰器函数,f是被装饰的函数
    def inner(*args,**kwargs):    #定义一个内置函数,且和下面统级别的返回值名字一致且不加括号
                                  #动态参数一定要原封不动的传给 被装饰的函数 f()
        '''在被装饰函数之前要做的事'''
        ret = f(*args,**kwargs)   #被装饰的函数  函数执行完的返回值要原封不动传给 return
        '''在被装饰函数之后要做的事'''
        return ret
    return inner

@wrapper         #语法糖 @装饰器函数名 等价于 func = wrapper(func)
def func(a,b):     #被装饰的函数
    time.sleep(0.01)
    print('你好:世界',a,b)
    return '新年好'
#print(func(23,45))  #接收返回值
ret = func(23,45)   #接收返回值
print(ret)

猜你喜欢

转载自www.cnblogs.com/ysging/p/10061904.html