美文网首页
可自定义属性的装饰器

可自定义属性的装饰器

作者: noteby | 来源:发表于2019-02-19 16:19 被阅读0次

场景:想写一个装饰器来包装一个函数,并且允许用户提供参数在运行时控制装饰器行为。

from functools import wraps, partial
import logging


def attach_wrapper(obj, func=None):
    """
    如果需要减少某个函数的参数个数,可以使用 functools.partial() 。
    partial() 函数允许给一个或多个参数设置固定的值,减少接下来被调用时的参数个数

    """
    if func is None:
        return partial(attach_wrapper, obj)
    setattr(obj, func.__name__, func)
    return func


def logged(level, name=None):
    """
    Add logging to a function. level is the logging
    level, name is the logger name. If name aren't 
    specified, they default to the function's module and name.
    """

    def decorate(func):
        logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        log_name = name if name else func.__module__
        log = logging.getLogger(log_name)

        @wraps(func)
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            log.log(level, result)
            return result

        @attach_wrapper(wrapper)
        def set_level(new_level):
            nonlocal level
            level = new_level

        @attach_wrapper(wrapper)
        def get_level():
            return level

        # wrapper.get_level = lambda: level

        return wrapper

    return decorate


@logged(logging.DEBUG)
def add(x, y):
    return x + y


if __name__ == '__main__':
    add(3, 2)

    add.set_level(logging.INFO)
    add(5, 5)

    print(add.get_level())
2019-02-19 16:29:22,195 - __main__ - DEBUG - 5
2019-02-19 16:29:22,195 - __main__ - INFO - 10
20

相关文章

  • 可自定义属性的装饰器

    场景:想写一个装饰器来包装一个函数,并且允许用户提供参数在运行时控制装饰器行为。

  • ES6 系列之我们来聊聊装饰器

    Decorator 装饰器主要用于: 装饰类 装饰方法或属性 装饰类 装饰方法或属性 Babel 安装编译 我们可...

  • angular 学习记录(六)

    一、自定义指令: 属性型指令至少需要一个带有@Directive装饰器的控制器类。该装饰器指定了一个用于标识属性的...

  • python 可自定义属性的装饰器

    问题 你想写一个装饰器来包装一个函数,并且允许用户提供参数在运行时控制装饰器行为。 解决方案 引入一个访问函数,使...

  • swiftUI学习(一)

    @state属性:用@state声明以后,他会帮我们默认生成以下操作 自定义属性装饰器: 去使用

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • 目录

    Python自定义装饰器

  • HostListener & HostBinding

    HostListener 是属性装饰器,用来为宿主元素添加事件监听。HostBinding 是属性装饰器,用来动态...

  • 前端装饰器ES decorator,从原理到入门

    装饰器 添加静态属性(修饰类本身) 添加实例属性(通过 prototype 对象操作) 通过 mixins 装饰器...

网友评论

      本文标题:可自定义属性的装饰器

      本文链接:https://www.haomeiwen.com/subject/zfcfyqtx.html