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 条评论
登录 后参与评论

相关文章

来自专栏TeamsSix的网络空间安全专栏

Python Threading 学习笔记 | 2、添加线程

添加线程,threading.Thread()接收参数target代表这个线程要完成的任务,需自行定义

8630
来自专栏TeamsSix的网络空间安全专栏

Python Threading 学习笔记 | 4、Queue功能

queue模块实现了各种【多生产者-多消费者】队列,可用于在执行的多个线程之间安全的交换信息。

6440
来自专栏腾讯大讲堂的专栏

李小璐PGone视频引全民吃瓜,让渡隐私权成社交必然代价?

10月30日下午,演员李小璐和说唱歌手PGone的几段亲密视频在网络引发热议。当天晚间,PGone在微博文章中提到:“为什么去年在抖音拍的视频没有任何外传的前...

22750
来自专栏中国白客联盟

数据库的一些注入技巧-mysql

SELECT 1 FROM dualWHERE 1 = '1'''''''''''''UNION SELECT '2';

6430
来自专栏Java3y

从react 编程 到 "好莱坞"

Reactive Programming(响应式编程)已经不是一个新东西了。关于 Reactive 其实是一个泛化的概念,由于很抽象,一些理论性的介绍很容易把人...

6610
来自专栏前端自习课

【Web技术】400- 浅谈Shadow DOM

你在实际的开发中很可能遇到过这样的需求:实现一个可以拖拽的滑块,以实现范围选择、音量控制等需求。

8440
来自专栏TeamsSix的网络空间安全专栏

Python Threading 学习笔记 | 5、不一定有效率GIL

GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。

7140
来自专栏TeamsSix的网络空间安全专栏

Python Threading学习笔记 | 1 什么是多线程?

多线程类似于同时执行多个不同程序,比如一个很大的数据,直接运行的话可能需要10秒钟才能运行完。

9750
来自专栏TeamsSix的网络空间安全专栏

Python Threading 学习笔记 | 3、join功能

可以看到在线程还没有结束的时候,程序就开始运行之后的代码了,也就是说线程和其他部分的程序都是同步进行的,如果想要避免这种情况,想要程序按照代码顺序执行的话,就需...

5920
来自专栏java思维导图

使用nginx部署网站

如果服务器只需要放置一个网站程序,解析网站到服务器的网站,网站程序监听80端口就可以了。如果服务器有很多应用,借助nginx不仅可以实现端口的代理,还可以实现负...

12230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励