一、装饰器
#双层装饰器 def auth(func): def inner(*args,**kwargs): res=func(*args,**kwargs) return res return inner
二、关于flask案例
#安装flask: pip install flask #注意:这里伪代码,如果把所有页面装饰上判断用户是否登录的判断 from flask import Flask app=Flask(__name__) def auth(func): def inner(*args,**kwargs): #这里是伪代码没写,可以加上判断:用户是否登录,登录就继续执行,没登录就跳转到登录页面 res=func(*args,**kwargs) return res return inner @auth def index(): '''这个是index函数的注释''' return 'index' # @auth def info(): return 'info' # @auth def order(): return 'order' # @auth def register(): return 'register' app.add_url_rule('/index/',view_func=index) app.add_url_rule('/info/',view_func=info) app.add_url_rule('/order/',view_func=order) app.add_url_rule('/register/',view_func=register) if __name__ == '__main__': app.run()
三、
1、不加装饰器
#注释放在这里不行,放在下面更不行,因为执行了return那么下面的代码都不会执行了 '''这个是index函数的注释''' def index(): '''这个是index函数的注释''' return 'index' def info(): '''这个是info函数的注释''' return 'info' print(index.__name__)#打印出函数名 print(index.__doc__)#打印出函数内的注释(不能放在函数外!) print(info.__name__) print(info.__doc__) ''' 打印出: index 这个是index函数的注释 info 这个是info函数的注释 '''
2、加上装饰器
def auth(func): def inner(*args,**kwargs): res=func(*args,**kwargs) return res return inner @auth #注释放在这里不行,放在下面更不行,因为执行了return那么下面的代码都不会执行了 '''这个是index函数的注释''' def index(): '''这个是index函数的注释''' return 'index' @auth def info(): '''这个是info函数的注释''' return 'info' print(index.__name__)#打印出函数名 print(index.__doc__)#打印出函数内的注释(不能放在函数外!) print(info.__name__) print(info.__doc__) ''' 打印出: inner None inner None '''
3、加上装饰器并且不改变原需求
#需要导入functools模块 import functools def auth(func): @functools.wraps(func) def inner(*args,**kwargs): res=func(*args,**kwargs) return res return inner @auth #注释放在这里不行,放在下面更不行,因为执行了return那么下面的代码都不会执行了 '''这个是index函数的注释''' def index(): '''这个是index函数的注释''' return 'index' @auth def info(): '''这个是info函数的注释''' return 'info' print(index.__name__)#打印出函数名 print(index.__doc__)#打印出函数内的注释(不能放在函数外!) print(info.__name__) print(info.__doc__) ''' 打印结果: index 这个是index函数的注释 info 这个是info函数的注释 '''
4、注意
#注意: 一般情况下不用functools也可以实现装饰器的基本功能,但在后期项目开发时,不加functools会出错(内部会读取__name__,
且__name__重名的话就会报错),所以要注意规范起自己的写法