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()









posted @ 2020-05-07 18:15  daoda  阅读(201)  评论(0)    收藏  举报