# 装饰器
# 为什么要用装饰器及开放封闭原则
# 一旦代码上线使用了,就要遵守开放封闭原则。代码相关的不允许随便改。
# 由于原代码不能随便改,同时要增加新的功能,就要用装饰器
# 什么是装饰器(本质是函数)
# 原代码:
# def index():
# print('welcome to boy')
#
# index()
# 我想打印'welcome to boy'后打印时间,但不能动原代码
# import time
# def timmer(aa):
# def bb():
# # aa=最原始的index bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
# print(aa)
# start_time=time.time()
# aa()
# stop_time=time.time()
# # 统计运行时间
# print("run time is %s" %(stop_time-start_time))
# return bb
# @就是在下面函数上加装饰器
# index=timmer(index) # index是函数名字,timmer是装饰器名字
# @timmer
# def index():
# time.sleep(3)
# print('welcome to oldboy')
#
# index()
# import time
# def timmer(aa):
# def bb(name):
# # aa=最原始的index bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
# print(aa)
# start_time=time.time()
# aa(name)
# stop_time=time.time()
# # 统计运行时间
# print("run time is %s" %(stop_time-start_time))
# return bb
#
# @timmer
# def abc(name):
# time.sleep(3)
# print('welcome to oldboy')
#
# abc("jensen")
# 由于还些函数有参数,有些没,参数个数不一定样,需要用*args,**kwargs
# import time
# def timmer(aa):
# def bb(*args,**kwargs):
# # aa=最原始的index bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
# print(aa)
# start_time=time.time()
# aa(*args,**kwargs)
# stop_time=time.time()
# # 统计运行时间
# print("run time is %s" %(stop_time-start_time))
# return bb
#
# # @就是在下面函数上加装饰器
# # index=timmer(index) # index是函数名字,timmer是装饰器名字
# @timmer
# def index():
# time.sleep(3)
# print('welcome to oldboy')
#
# index()
#
# @timmer
# def abc(name):
# time.sleep(5)
# print('welcome to %s' %name)
#
# abc("jensen")
# 外部命令有返回值的话,需要在装饰器内部也要有返回值
import time
def timmer(aa):
def bb(*args,**kwargs):
# aa=最原始的index bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
print(aa)
start_time=time.time()
# ff要接收aa()是返回值
ff=aa(*args,**kwargs)
stop_time=time.time()
# 统计运行时间
print("run time is %s" %(stop_time-start_time))
return ff
return bb
@timmer
def my_max(x,y):
print('my_max function:')
res=x if x>y else y
return res
res=my_max(1,2)
print('=====>',res)
===================有参装饰器
# 有参装饰器
def auth2(auth_type):
def auth(func):
# print(auth_type)
def wrapper(*args,**kwargs):
if auth_type=='file':
name=input('姓名:')
passwd=input('密码:')
if name=='xie' and passwd=='123':
print("成功认证")
res=func(*args,**kwargs)
return res
else:
print("认证不成功")
elif auth_type=='sql':
print('错误')
return wrapper
return auth
# index=auth(index)
# 无参函数默认本地文件,如果不是本地,就要有参函数
@auth2(auth_type='file')
def index():
print('welcome to inex page')
index()
# 输入一次用户名密码,下次调用不用再输入
import time
login={'name':None,'pwd':False}
def timmer(xie):
def bb(*args,**kwargs):
# aa=最原始的index bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
start_time=time.time()
# ff要接收aa()是返回值
ff=xie(*args,**kwargs)
stop_time=time.time()
# 统计运行时间
print("run time is %s" %(stop_time-start_time))
return ff
return bb
def bb2(auth_type='file'):
def bb(xie):
def rr(*args,**kwargs):
if login['name'] and login['pwd']:
res=xie(*args,**kwargs)
return res
if auth_type == 'file':
name=input("输入用户名:")
passwd=input("输入密码:")
if name=='xie' and passwd=='123':
res=xie(*args,**kwargs)
login['name']=name
login['pwd']=True
return res
else:
print("错误")
elif auth_type == "sql":
print("很香")
return rr
return bb
@timmer
@bb2(auth_type="file")
def aa():
print("苹果")
@bb2(auth_type="file")
def cc():
print("香蕉")
aa()
cc()
# 先aaa,再bbb,再ccc
# @ccc
# @bbb
# @aaa
# def func():
# pass
# 读文件的用户名密码
# login={'name':None,'login':False}
#
# with open('username','w') as f:
# f.write(str(login))
with open('username','r') as f:
x=f.read()
print(x)
print(eval(x)['name'])
return 函数返回内存地址
把函数注释放到装饰器中
# 输入一次用户名密码,下次调用不用再输入
import time
from functools import wraps
# 要输出程序解释:我的小房子,就要用语句 from functools import wraps再加上@wraps(xie)
login={'name':None,'pwd':False}
def timmer(xie):
# @wraps(xie)
def bb(*args,**kwargs):
'我的衣服'
# aa=最原始的index bb()=index(),如果index(x,y),则bb()也要bb(x,y) ,aa()也要aa(x,y)
start_time=time.time()
# ff要接收aa()是返回值
ff=xie(*args,**kwargs)
stop_time=time.time()
# 统计运行时间
print("run time is %s" %(stop_time-start_time))
return ff
return bb
def bb2(auth_type='file'):
def bb(xie):
@wraps(xie)
def rr(*args,**kwargs):
if login['name'] and login['pwd']:
res=xie(*args,**kwargs)
return res
if auth_type == 'file':
name=input("输入用户名:")
passwd=input("输入密码:")
if name=='xie' and passwd=='123':
res=xie(*args,**kwargs)
login['name']=name
login['pwd']=True
return res
else:
print("错误")
elif auth_type == "sql":
print("很香")
return rr
return bb
@timmer
@bb2(auth_type="file")
def aa():
'我的水果'
print("苹果")
print(aa.__doc__)
@bb2(auth_type="file")
def cc():
'我的小房子'
print("香蕉")
print(cc.__doc__)
aa()
cc()
print(cc.__doc__)
# 先aaa,再bbb,再ccc
# @ccc
# @bbb
# @aaa
# def func():
# pass