前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python笔记:装饰器(面向切面)

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

作者头像
超级大猪
发布2019-11-22 09:41:13
5610
发布2019-11-22 09:41:13
举报
文章被收录于专栏:大猪的笔记大猪的笔记

在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)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-10-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档