python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
对于理解python装饰器,我这里准备了几个小例子,一步步的详情解释,python装饰器是什么,如何去使用,最后在留下一道题目,测试自己是否理解了python装饰器。
import time
# 第一例def foo():
print('foo...')
time.sleep(1)
def show_time(f):
def inner():
start = time.time()
f()
end = time.time()
print('spend %s '%(end-start))
return inner
foo=show_time(foo)
foo()
# 第二例def show_time(f):
def inner():
start = time.time()
f()
end = time.time()
print('spend %s '%(end-start))
return inner
@show_time # foo=show_time(foo)
def foo():
print('foo...')
time.sleep(1)
foo()
# 第三例def show_time(f):
def innner(*a,**b):
start = time.time()
f(*a,**b)
end = time.time()
print('spend %s ' % (end - start))
return innner
@show_time # foo=show_time(foo)
def add(*a,**b):
sum_num = 0;
for i in a:
sum_num += i;
print(sum_num)
time.sleep(1)
add(1,2,4,5)
# 第四例 装饰器形参def log(flag=''):
def show_time(f):
def innner(*a, **b):
start = time.time()
f(*a, **b)
end = time.time()
print('spend %s ' % (end - start))
if flag=='true':
print('打印日志')
return innner
return show_time
@log('true') # foo=log(foo) foo(add(*a,**b))
def add(*a,**b):
sum_num = 0;
for i in a:
sum_num += i;
print(sum_num)
time.sleep(1)
add(1,2,4,5)
@log()
def bar(*a,**b):
sum_num = 0;
for i in a:
sum_num += i;
print(sum_num)
time.sleep(1)
bar(1,2,4,5)
## 题目
# 练习作业
# 题目:一个登陆的小程序
# 要求:1 当进入home() 和 shopcar() 的时候,需要验证登录
# 2 当进入book() 页面的是则不需要登陆
# 3 在home() 或者 shopcar() 页面 登陆过则不需要登陆
# 4 依次执行三个函数 home() shopcar() book()user= 'admin'
passwd = 123
login_status = False
def login(auth_type=''):
def inner(f):
def main():
global login_status
f()
if login_status == False:
if auth_type == 'jindong':
print('jindong..login...')
elif auth_type =='weixin':
print('weixin...login...')
else:
pass
username = input("username:")
password = int(input("password:"))
if user == username and passwd == password:
print('welcome...')
login_status = True
else:
print('username or password is error')
return main
return inner
@login('jindong')
def home():
print('home...')
@login('weixin')
def shopcar():
print('shopcar...')
def book():
print('book...')
home()
shopcar()
book()