专栏首页大猪的笔记Python笔记:装饰器(面向切面)

Python笔记:装饰器(面向切面)

在Python中可以很方便的使用装饰器实现简单的依赖注入。

资料如下:

http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

顺便做了一个拦截器。可以注入前置函数。

import functools
funcs_config = {}

class FuncInjectItem(object):
    def __init__(self):
        self.func = None
        self.args = ()
        self.func_type = "simple"

class FuncInfo(object):
    def __init__(self):
        self.args = None
        self.kwargs = None
        self.func = None

def inject(some_func):
    @functools.wraps(some_func)
    def wrap(*args, **kwargs):
        if some_func.__name__ in funcs_config:
            before_funcs = funcs_config[some_func.__name__]
            for item in before_funcs:
                if item.func_type == "simple":
                    item.func(*item.args)
                    return some_func(*args, **kwargs)
                if item.func_type == "normal":
                    func_info = FuncInfo()
                    func_info.args = args
                    func_info.kwargs = kwargs
                    func_info.func = some_func
                    item.func(func_info, *item.args)
                    return func_info.func(*func_info.args, **func_info.kwargs)
        else:
            return some_func(*args, **kwargs)
    return wrap

def __register(target, func, func_type, args):
    inject_item = FuncInjectItem()
    inject_item.func = func
    inject_item.args = args
    inject_item.func_type = func_type
    
    if target.__name__ in funcs_config:        
        func_array = funcs_config[target.__name__]
        for item in func_array:
            if item.func.__name__ == func.__name__:
                print("func is already exist")
                return
        func_array.append(inject_item)
    else:
        func_array = [inject_item]

    funcs_config[target.__name__] = func_array

def register(target, func, args):
    __register(target, func, "simple", args)

def register_normal(target, func, args):
    __register(target, func, "normal", args)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • rxgo笔记

    超级大猪
  • go: 插件系统

    参考文章: https://toutiao.io/posts/adjoci/preview

    超级大猪
  • go 自定义排序

    超级大猪
  • package sync

    sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。

    李海彬
  • 函数对象

    py3study
  • Python函数参数分类原理详解

    在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号,隔开

    砸漏
  • Go中的依赖注入

    I have written a small utility package to handle dependency injection in Go (it'...

    李海彬
  • Hello Lightning Network -0

    有许多比特币社区的先行者们面对小白的提问时,总是真诚的说:“去看看比特币的白皮书吧,把它真正弄明白吧,你就会理解一切的。” —–如今,我想对许多质疑闪电网络的比...

    happy123.me
  • OCP-052考试题库汇总(47)-CUUG内部解答版

    Which three are true about the Automatic Database Diagnostic Monitor (ADDM)?

    用户5892232
  • 0825-7.1.4-如何重置Ranger Admin Web UI登录密码

    Ranger Admin Web UI默认的登录名是admin,正常情况下我们可以进入Ranger页面的Setting 位置修改用户密码。本文描述了当我们忘记了...

    Fayson

扫码关注云+社区

领取腾讯云代金券