初始装饰器
-
-
开放:对代码的拓展开放。
-
封闭:源码进行修改是封闭的。
-
-
装饰器:完全遵守开放封闭原则。
-
装饰器:在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。
-
装饰器就是一个函数。
-
-
装饰器的初始:
-
版本一
import time
def index():
'''有很多代码'''
time.sleep(2)#模拟的网络延迟或者代码效率
print('欢迎登陆')
print(time.time())#格林威治时间
start_time = time.time()
index()
end_time = time.time()
print(end_time-start_time) -
版本二利用函数,解决代码重复的问题
import time
def index():
'''有很多代码'''
time.sleep(2)
print('欢迎登录博客园')
def timmer(f):
start_time = time.time()
f()
end_time = time.time()
print(en_time-start_time)
timmer(index)
版本二还是有问题:原来index函数源码没有变化,给原函数添加一个新的功能,测试原函数的执行效率功能。
不满足开放封闭原则,原函数的调用方式改变了 -
版本三:不能改变原函数的调用方式。
import time
def index():
'''很多代码'''
time.sleep(2)#模拟的网络延迟或者代码效率
print('欢迎登录博客园首页')
def timmer(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print(end_time-start_time)
return inner
index = timmer(index) #inner
index() #inner()
-
版本四:具体研究
import time
def index():
'''有很多代码'''
time.sleep(2)
print('欢迎登陆博客园首页')
def timmer(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print(end_time-start_time)
return inner
index = timmer(index)
index() -
版本五:python做了一个优化:提出了一个语法糖的概念。标准版的装饰器
import time
#timmer装饰器
def timmer(f):
def inner():
start_time = time.time
f()
end_time = time.time
print(end_time-start_time)
return inner -
版本六:被装饰函数带返回值
import time
def timmer(f):
f = index
def inner():
start_time = time.time()
print(f'这个是f():{f()}')#index()
r = f()
end_time = time.time()
print(end_time-start_time)
return r
return inner -
版本七:被装饰函数带参数
import time
def timmer(f):
def inner(*args,**kwargs):
#函数的定义:*聚合 args = ('王兴豪',19)
start_time = time.time()
r = f(*args,**kwargs)
#函数的执行:*打散:f(*args)-->f(*('王兴豪',19))-->f('王兴豪',19)
end_time = time.time()
print(end_time-start_time)
return r
return inner -
标准版装饰器
#标准版装饰器
def wrapper(f):
def inner(*args,**kwargs):
'''添加额外的功能:执行被装饰函数之前的操作'''
ret = f(*args,**kwargs)
'''添加额外的功能:执行被装饰函数之后的操作'''
return ret
return inner
-