• 函数——装饰器


    一、装饰器

    #双层装饰器
    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__重名的话就会报错),所以要注意规范起自己的写法
  • 相关阅读:
    Webservice里使用Linq遇到ToList输出泛型而产生循环引用错误的解决办法(转)
    JavaScript 面向对象程序设计(转)
    SilverLight中的基本图形(转)
    JQuery常用方法一览(转)
    常用的JS(转)
    简单的java socket 服务器端
    Eclipse RCP 之国际化(转载)
    使用Eclipse构建GeoTools项目
    java.lang.UnsatisfiedLinkError: no XX in java.library.path解决方法
    sqlite第三方类库:FMDB使用(转载)
  • 原文地址:https://www.cnblogs.com/guojieying/p/14228378.html
Copyright © 2020-2023  润新知