闭包:
1.函数内嵌套函数
2.内部函数引用外部函数的局部变量
3.外部函数的返回值是内部函数
闭包的缺点:
由于内部函数引用了外部函数的局部变量,导致外部函数执行完之后,局部变量没有及时释放,占用内存
装饰器的作用:
在不更改原始函数的基础上,为函数添加一些额外功能
不带参数
def run_time(func):
def test():
start = datetime.now()
func()
print(datetime.now() - start)
print(type(test))
return test
# 下面的装饰器 等同于这句话 eat = run_time(eat)
@run_time
def eat():
print('吃饭了')
# 把eat函数对象传递到run_time函数中
# 当调用eat()函数时,实际上执行的闭包中的test()函数
eat()
携带参数
def premission(form_role):
# 函数装饰器的开始
def role(func):
def test():
if 3 > form_role:
func()
else:
print('没有权限')
return test
return role
# premission(2) 返回role函数对象
# 相当于写了@role
# 装饰器执行完成之后相当于 sleep = role(sleep)
@premission(5)
def sleep():
print('睡觉了...')
sleep()
# 下面的写法等同于使用装饰器的写法
# 1.执行premission(2)返回role函数
# role = premission(2)
# 2.执行role返回test函数,并赋值给sleep
# sleep = role(sleep)
# 3.执行sleep()就是执行test()
# sleep()
判断用户是否登录的装饰器
def islogin(func)
def login_function(request,*args,**kwargs):
if request.session.get('u_name',None):
return func(request,*args,**kwargs)
else:
response=HttpResponseRedirect(settings.LOGIN_URL)
response.set_cookie('next_url',response.get_full_path())
return response
return login_function
@islogin
def center(request):
return render(request,'center.html')