函数——装饰器

一、装饰器

#双层装饰器
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__重名的话就会报错),所以要注意规范起自己的写法
原文地址:https://www.cnblogs.com/guojieying/p/14228378.html