zoukankan      html  css  js  c++  java
  • Python

    1. 装饰器的示例1

    参考:

    Fluent_Python的笔记,http://www.cnblogs.com/allen2333/p/8848010.html

    装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。(符合开闭原则)。
    应用场景:比如插入日志、性能测试、事务处理、缓存、权限校验等场景。
    实现: 高阶函数+函数嵌套+闭包

    import functools
    
    
    def wrapper(func):
        @functools.wraps(func)  # 帮助我们设置函数的元信息,注释看看。保存原函数某些信息
        def inner(*args, **kwargs):
            return func(*args, **kwargs)
    
        return inner
    
    
    @wrapper
    def f1():
        pass
    
    
    @wrapper
    def f2():
        pass
    
    
    print(f1.__name__)
    print(f2.__name__)
    
    

    2. 装饰器的示例2

    def timer(func):                    #装饰器
        def inner(*args,**kwargs):
            '''执行函数之前要做的'''
            ret = func(*args,**kwargs)
            '''执行函数之后要做的'''
            return ret
        return inner
    
    @timer                               #@timmer 相当于 func = timmer(func)
    def func():
        print("我是一只小小鸟")
    
    func()                               #func() = inner()    调用装饰器
    
    def timer(func):
    
        def inner(*args,**kwargs):
            print("xxx")                    #在执行前打印
            ret = func(*args,**kwargs)
            print("abc")              #在执行后打印
            return ret
        return inner
    
    @timer
    def func():
        print("我是一只小小鸟")
    
    func()
    
    
    计算结果:
    
    xxx
    我是一只小小鸟
    abc
    
    

    3. functools.wraps

    参考:

    https://segmentfault.com/a/1190000009398663
    https://docs.python.org/3.6/library/functools.html#functools.wraps

    wraps函数其实就是一个修饰器版的update_wrapper函数,它的功能和update_wrapper是一模一样的。
    就是将被修饰的函数(wrapped) 的一些属性值赋值给 修饰器函数(wrapper)。

    4. flasky中的检查权限,用装饰器实现

    git reset --hard 9a。
    实现了两个装饰器,一个用来检查常规权限,一个专门用来检查管理员权限。

    from functools import wraps
    from flask import abort
    from flask_login import current_user
    from .models import Permission
    
    
    def permission_required(permission):
        def decorator(f):
            @wraps(f)
            def decorated_function(*args, **kwargs):
                if not current_user.can(permission):
                    abort(403)
                return f(*args, **kwargs)
            return decorated_function
        return decorator
    
    
    def admin_required(f):
        return permission_required(Permission.ADMIN)(f)
    
    def permission_required(permission):
        def decorator(f):
            @wraps(f)
            def decorated_function(*args, **kwargs):
                if not g.current_user.can(permission):
                    return forbidden('Insufficient permissions')
                return f(*args, **kwargs)
            return decorated_function
        return decorator
    
  • 相关阅读:
    ASP.NET刷新页面的六种方法
    web安全攻防实践能力培养引导
    流程控制 ifwhilefor 语句
    迭代器和生成器
    闭包函数装饰器
    元组字典集合及内置方法
    字符编码与文件操作
    字符类型及内置方法
    初识函数
    递归匿名函数常用的内置方法
  • 原文地址:https://www.cnblogs.com/allen2333/p/9016631.html
Copyright © 2011-2022 走看看