import time
def timer(f):
def inner():
start = time.time()
ret = f()
end = time.time()
print(end-start)
return ret
return inner #返回函数地址,没有括号
@timer
def func():
time.sleep(1)
print‘大家好我是渣渣辉‘
return ‘是兄弟就来砍我‘
ret = func() #此处实际上执行的是inner
print(ret)
#在不修改原函数的情况下添加功能,timer就是一个装饰器函数
#################################################
装饰器标准格式
def wrapper(f):
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
return ret
return inner
装饰器的本质:闭包函数
#################################################
from functools import wraps
def wrapper(func):
@wraps(func)
def inner(*args,**kwargs):
print(‘大家好‘)
ret = func(*args,**kwargs)
print(‘这是你没玩过的全新版本‘)
return ret
return inner
@wrapper #legend = wrapper(legend)
def legend(a):
print(‘我是%s‘%(a))
return ‘是兄弟就来砍我‘
print(legend.__name__)
print(legend.__doc__)
ret = legend(‘渣渣辉‘)
print(ret)
#演示装饰器和函数的执行顺序
######################################################
为多个函数增加记录调用功能,先将被调用的函数名称写入文件
def log(func):
def inner(*args,**kwargs):
with open(‘log‘,‘a‘,encoding= utf8) as f:
f.write(func.__name__+‘\n‘)
ret = func(*args,**kwargs)
return ret
return inner
@log
def shoplist_add():
print(‘购物车增加一件商品‘)
@log
def shoplist_del():
print(‘购物车删除一件商品‘)
###################################################
为多个函数增加单次登陆验证
FLAG = 0
def login(func):
def inner(*args,**kwargs):
global FLAG
if FLAG:
ret = func(*args,**kwargs)
return ret
else:
uername = input(‘请输入用户名:‘)
userpwd = input(‘请输入密码:‘)
if username == ‘天使萌‘ and userpwd ==‘123‘:
FLAG = 1
ret = func(*args,**kwargs)
return ret
else:
print(‘登陆失败‘)
return inner
@login
def shoplist_add():
print(‘购物车增加一件商品‘)
@login
def shoplist_del():
print(‘购物车删除一件商品‘)
shoplist_add()
shoplist_add()
shoplist_del()
shoplist_del()
###############################################
读取网页内容并储存到文件,如果文件有内容则直接从文件读取
import os
from urllib.request import urlopen
def cache(func):
def inner(*args,**kwargs):
if os.path.filesize(‘web_cache‘):
with open(‘web_cache‘,‘wb‘) as f:
return f.read()
ret = func(*args,**kwargs)
with open(‘web_cache‘,‘wb‘) as f:
f.write(b‘*****‘+ret) #以十六进制写入
return ret
return inner
@cache
def get(url):
code = urlopen(url).read()
return code
ret = get(‘baidu.com‘)
print(‘ret‘)
原文:https://www.cnblogs.com/farion/p/9863590.html