zoukankan      html  css  js  c++  java
  • 函数——装饰器

    一、装饰器

    #双层装饰器
    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__重名的话就会报错),所以要注意规范起自己的写法
  • 相关阅读:
    full gc
    C#调用C++编写的DLL
    用C#调用C++DLL提示找不到DLL解决方法【转】
    VS2015 编写C++的DLL,并防止DLL导出的函数名出现乱码(以串口通信为例,实现串口通信)
    VS2015 C++ 获取 Edit Control 控件的文本内容,以及把获取到的CString类型的内容转换为 int 型
    VS2015 建立一个C++的MFC简易窗体程序项目
    C# 实现串口发送数据(不用串口控件版)
    STM32 HAL库的定时器中断回调函数跟串口中断回调函数
    把 Python 脚本打包成可以直接双击运行的 .exe 文件 【转】
    Python 实现把 .cvs 文件保存为 Excel 文件
  • 原文地址:https://www.cnblogs.com/guojieying/p/14228378.html
Copyright © 2011-2022 走看看