day17

装饰器:1.what
器:指的就是一种工具,可以定义成函数
装饰:指的就是为其他事物添加额外的点缀
合在一起:指的就是定义一个函数用来装饰其他函数也就是为其他函数添加额外功能的
2.why
开放封闭原则:
开放:是对拓展功能来说是开放的
封闭:是对源代码的修改是封闭的
装饰器就是在不修改源码的情况下为装饰对象添加额外的功能,源码包括函数的定义和调用两个过程
3.how
# 需求:在不修改index函数的源代码以及调用方式的前提下为其添加统计运行时间的功能
import time
time.time()获取当前时间
def index(x,y):
time.sleep(3)
print('index %s %s' %(x,y))

index(111,222)
index(y=111,x=222)
index(111,y=222)

解决方案一:失败
# 问题:没有修改被装饰对象的调用方式,但是修改了其源代码
# def index(x,y):
# start=time.time()
# time.sleep(3)
# print('index %s %s' %(x,y))
# stop = time.time()
# print(stop - start)
#
# index(111,222)

# 解决方案二:
# 问题:没有修改被装饰对象的调用方式,也没有修改了其源代码,并且加上了新功能
# 但是代码冗余
# import time
#
# def index(x,y):
# time.sleep(3)
# print('index %s %s' %(x,y))
#
# start=time.time()
# index(111,222)
# stop=time.time()
# print(stop - start)

# 解决方案三:
# 问题:解决了方案二代码冗余问题,但带来一个新问题即函数的调用方式改变了
import time

def index(x,y):
time.sleep(3)
print('index %s %s' %(x,y))

def wrapper():
start=time.time()
index(111,222)
stop=time.time()
print(stop - start)

wrapper()

def index(x,y,z):
time.sleep(3)
print('index %s %s %s' %(x,y,z))

print(index)

def outter(func):
# func = index的内存地址
def wrapper(*args,**kwargs):
start=time.time()
func(*args,**kwargs) # index的内存地址()
stop=time.time()
print(stop - start)
return wrapper

index=outter(index) # f=outer(index的内存地址)
# f=当初那个wrapper函数的内存地址
print(index)

# index(x=1,y=2,z=3)
# index(1,2,3)
index(1,z=3,y=2)
语法糖:在被装饰函数的上方,放一个@装饰器名代替了index=outter(index) # f=outer(index的内存地址)的工作

原文地址:https://www.cnblogs.com/Jicc-J/p/12555613.html