Python第十四天
大纲
装饰器
装饰 装修 房子就可以住 如果装修 不影响你住 而且体验更加 让你生活中增加了很多功能,洗澡 看电视 器:工具
1 开放封闭原则
开放:对代码的拓展是开放的 更新地图 加新枪等
封闭:对源码的修改是封闭的 闪躲 就是一个功能 一个函数 别人赤手空拳打你,用机枪扫你,扔雷这个功能不会改变
装饰器:完全遵循开放封闭原则
装饰器:在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。
装饰器就是一个函数。
#版本一:要求写一些代码测试一下index函数的执行效率 时间差
# import time
# def index():
# '''henduodaima'''#模拟的是网路延时或代码的效率
# time.sleep(2)
# print('huanyingdenglubokeyuan')
# # index()
# def dariy():
# '''henduodaima'''#模拟的是网路延时或代码的效率
# time.sleep(2)
# print('huanyingdenglurijiyemian')
#
# #导入time模块
# # print(time.time())#格林威治时间,1970010100;00:00
#
# start_time=time.time()
# index()
# end_time=time.time()
# print(end_time - start_time)
#
# start_time=time.time()
# dariy()
# end_time=time.time()
# print(end_time - start_time)
#版本一有问题 如果测试别人的代码,必须重新赋值粘贴
#版本二;解决代码重复使用的问题
# import time
# def index():
# '''henduodaima'''#模拟的是网路延时或代码的效率
# time.sleep(2)
# print('huanyingdenglubokeyuan')
#
# def dariy():
# '''henduodaima'''#模拟的是网路延时或代码的效率
# time.sleep(2)
# print('huanyingdenglurijiyemian')
#
# def timer(f):#f=index
# start_time=time.time()
# f()#index()
# end_time=time.time()
# print(end_time - start_time)
# print(f'ceshibenhanshudezhixingxiaolv(end_time - start_time)')
# timer(index)
# timer(dariy)
#版本二 的问题 原函数index 源码没有变化,给原函数添加了一个新的功能测试原函数执行效率的功能
#满足开放封闭原则么?没变源代码 加了新功能 但是调用方式改变了
#版本三 不能改变原函数的调用方式
#
import time
def index():
'''henduodaima'''#模拟的是网路延时或代码的效率
time.sleep(2)
print('huanyingdenglubokeyuan')
def timer(f):#f=index
def inner():
start_time=time.time()
f()#index()
end_time=time.time()
#print(end_time - start_time)
print(f'ceshibenhanshudezhixingxiaolv{end_time - start_time}')
return inner#内存地址
# timer(index)
# ret=timer(index)#ret=inner
# ret()#inner()
index=timer(index)#index=inner
index()#index()=inner()
最原始版的装饰器
def timer(f):#f=index
def inner():
start_time=time.time()
f()#index()
end_time=time.time()
#print(end_time - start_time)
print(f'ceshibenhanshudezhixingxiaolv{end_time - start_time}')
return inner#内存地址
index=timer(index)#index=inner
index()#index()=inner()
装饰器就是闭包
#版本四
import time
def index():
'''henduodaima'''#模拟的是网路延时或代码的效率
time.sleep(2)
print('huanyingdenglubokeyuan')
def timer(f):#f是自由变量 内存中创建的一个变量 这是局部作用域3
f=index#f就是index的内存地址
def inner():
start_time=time.time()
f()
end_time=time.time()
print(f'ceshibenhanshudezhixingxiaolv{end_time - start_time}')
return inner
index=timer(index)
index()#这是全局作用域
#版本五 Python做了一个优化 提出来一个语法糖的概念
import time
def timer(f):#标准版的timer装饰器
def inner():
start_time=time.time()
f()
end_time=time.time()
print(f'ceshibenhanshudezhixingxiaolv{end_time - start_time}')
return inner
@timer#index=timer(index)
def index():
'''henduodaima'''#模拟的是网路延时或代码的效率
time.sleep(2)
print('huanyingdenglubokeyuan')
index()

#版本六 被装饰函数带返回值
import time
def timer(f):#标准版的timer装饰器
def inner():
#f=index
start_time=time.time()
#print(f'zhegeshif(){f()}')#index()
r=f()
end_time=time.time()
print(f'ceshibenhanshudezhixingxiaolv{end_time - start_time}')
return r
return inner
@timer#index=timer(index)
def index():
'''henduodaima'''#模拟的是网路延时或代码的效率
time.sleep(2)
print('huanyingdenglubokeyuan')
return 666
#加上装饰器不应该改变原函数的返回值,所以666应该返回给下面的ret
#但是下面的这个 ret实际接收的是inner函数的返回值,而666返回给的是装饰器里面的
#f()也就是r,我们现在要解决的问题就是将r给inner的返回值
ret=index()
print(ret)
#版本八 被装饰函数带带参数
import time
def timer(f):#标准版的timer装饰器
def inner(*args,**kwargs):
#f=index函数的定义:*聚合 args=('li',18)
start_time=time.time()
#print(f'zhegeshif(){f()}')#index()
r=f(*args,**kwargs)# 函数的执行:*打散了 f(*args)->f(*('li',18))->f('li',18)
end_time=time.time()
print(f'ceshibenhanshudezhixingxiaolv{end_time - start_time}')
return r
return inner
@timer#index=timer(index)
def index(name):
'''henduodaima'''#模拟的是网路延时或代码的效率
time.sleep(2)
print(f'huanying{name}denglubokeyuan')
return 666
@timer
def dariy(name,age):
'''henduodaima'''#模拟的是网路延时或代码的效率
time.sleep(2)
print(f'huanying{age}sui{name}denglurijiyemian')
dariy('li',18)#inner('li',18)
index('naxin')
标注版的装饰器
def wrapper(f):
def inner(*args,**kwargs):
''' 添加额外的功能,执行被装饰函数之前的操作'''
ret=f(*args,**kwargs)
''' 添加额外的功能,执行被装饰函数之后的操作'''
return ret
return inner
装饰器的应用
最常用的是登录认证
def login():
pass
def register():
pass
status_dict={
'username':None,
'status':False,
}
def auth(f):
def inner(*args,**kwargs):
if status_dict['status']:
ret=f(*args,**kwargs)
return ret
else:
username=input('qingshuruming').strip()
password=input('qingshurumima').strip()
if username=="taib" and password=='123':
print('dengluchenggong')
status_dict['username']=username
status_dict['status']=True
ret=f(*args,**kwargs)
return ret
else:
print('denglushibai')
return inner
@auth
def article():
print('huanyingwenzhang')
@auth
def comment():
print('huanyingpinglun')
def dariy():
print('huanyingriji')
article()
comment()
# dariy()

浙公网安备 33010602011771号