V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lecher23
V2EX  ›  Python

自己对着 Java 的 IOC 概念撸了一个 Python 版的依赖注入工具

  •  
  •   lecher23 ·
    lecher23 · 2017-12-01 10:51:36 +08:00 · 5196 次点击
    这是一个创建于 2336 天前的主题,其中的信息可能已经有所发展或是发生改变。
    git 地址: https://github.com/lecher23/pioc

    欢迎大家提意见~
    20 条回复    2017-12-04 09:44:02 +08:00
    intohole
        1
    intohole  
       2017-12-01 13:41:21 +08:00
    好像深入学习修饰器功能
    intohole
        2
    intohole  
       2017-12-01 13:41:27 +08:00
    好想
    lecher23
        3
    lecher23  
    OP
       2017-12-01 13:42:53 +08:00
    @intohole 加油,自己多写几个装饰器就了解了
    misaka19000
        4
    misaka19000  
       2017-12-01 15:41:03 +08:00
    https://stackoverflow.com/a/2462076

    Python 中在 A 模块中先创建一个对象,之后在 B 模块中使用 import object from A 就可以获取到对象了额 O__O "…
    lecher23
        5
    lecher23  
    OP
       2017-12-01 16:31:47 +08:00
    @misaka19000 其实我这个注入工具主要是解藕服务,以及统一管理一些服务器资源拉,比如说我一个应用程序内部有很多的服务,我希望通过它就可以实现服务的管理,替换的时候只需要更换一个地方声明服务就好了...
    est
        6
    est  
       2017-12-01 16:37:58 +08:00
    @lecher23 python 里也可以直接替换的。。
    Axurez
        7
    Axurez  
       2017-12-01 16:41:57 +08:00
    @misaka19000 这不就是单例模式嘛,依赖注入可以有多种方式
    Axurez
        8
    Axurez  
       2017-12-01 16:43:37 +08:00
    而且依赖注入容器主要解决的是复杂的依赖关系,比如 A 依赖 B、C,C 依赖 D、E,B 又依赖 E、F,总不能一个一个去替换吧。
    xAx
        9
    xAx  
       2017-12-01 16:43:57 +08:00
    首先,你要认识到:喜欢搞 py 的人自认为很高雅!
    你怎么能说你是抄的 java 呢?
    楼主,你要感谢我这一层的存在,不然会有很多喜欢搞 py 的人来 gang 你。
    ipwx
        10
    ipwx  
       2017-12-01 17:01:32 +08:00
    Python 真的需要这种 style 的 design pattern 嘛?

    我觉得你这里要实现的功能,用 thread-local context 就能实现啊?
    thread-local context 而且是 python 里面大量被使用的 design pattern,python community 很熟悉它。
    对比你这里提到的 java style 的依赖反转,其实在 python community 是个非常陌生的概念。

    thread-local context 的例子:

    * Flask: request, response, current_app
    * Celery: current_app, current_task
    * TensorFlow: default_graph, default_session

    ...
    ipwx
        11
    ipwx  
       2017-12-01 17:03:38 +08:00
    好吧,我上面提到的 thread-local context 是为了能够动态修改某个子模块的外部依赖环境。

    如果你只是为了解决复杂的依赖关系,额,python 的 import 不就可以了嘛?

    毕竟我可以在 function level 进行 import:

    A.py:

    from B import f

    B.py:

    def f():
    ....import A
    ipwx
        12
    ipwx  
       2017-12-01 17:05:39 +08:00
    最后提一句,thread-local context 可以以 stack 的方式实现,这样的话就可以配合 with context 来临时把一个 context 推到栈顶,临时替换某个子模块的外部环境,然后退出 with 的时候也同时退出这个 context。这个设计非常之好用。
    LINAICAI
        13
    LINAICAI  
       2017-12-01 17:15:17 +08:00
    说的这么玄乎,我也是醉了,php 的概念为什么非得炒作?这只是很普通的设计模式吧
    xAx
        14
    xAx  
       2017-12-01 17:16:16 +08:00   ❤️ 2
    感谢楼上现身说法。
    楼主,现在你相信我了吗
    lecher23
        15
    lecher23  
    OP
       2017-12-01 18:23:49 +08:00
    @xAx 哈哈,就服你
    lecher23
        16
    lecher23  
    OP
       2017-12-01 18:25:35 +08:00
    @ipwx 感谢不吝赐教哈,thread-local context 这个我还真没仔细研究过,改天去啃一下。不过我觉得这个工具在我目前的开发中还是挺有用的,虽然从大家的意见来看的确有很多种实现方式。。。
    aristotll
        17
    aristotll  
       2017-12-01 18:37:25 +08:00
    janxin
        18
    janxin  
       2017-12-01 18:43:00 +08:00
    可能我不是很理解依赖注入的设计模式,我的理解是依赖注入需要靠 interface 实现的么,方便替换实现内容。但是 Python 的动态类型不需要这种笨重的方法...
    neoblackcap
        19
    neoblackcap  
       2017-12-01 23:59:15 +08:00
    @lecher23 为什么需要搞得像 Java 一样复杂的语法,装饰器又不是注解。想注入某些对象,完全可以在参数列表里面加默认值,这可是 Python 这些动态语言的大特性啊,Java 是因为是静态才需要搞成这样啊。
    lecher23
        20
    lecher23  
    OP
       2017-12-04 09:44:02 +08:00
    @neoblackcap 我并不觉得这个语法复杂,而且在解决系统各个服务的依赖方面,这个方式起码让我觉得比自己在构造服务的时候传参数方便很多..
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1114 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 22:53 · PVG 06:53 · LAX 15:53 · JFK 18:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.