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
    
  • 相关阅读:
    二元查找树的后序遍历结果
    CFileDialog设置多选时的一个问题
    KanRSS.com
    由shuttle这个单词想起的一个小故事
    Sun Java moved to the Partner repository
    Sun Java moved to the Partner repository
    扩展std::string功能的几个做法
    NetBeans 时事通讯(刊号 # 99 Apr 16, 2010)
    NetBeans IDE 6.9 Beta 发布
    KanRSS.com
  • 原文地址:https://www.cnblogs.com/allen2333/p/9016631.html
Copyright © 2011-2022 走看看