加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

依赖注入的Pythonic方法是什么?

发布时间:2020-12-14 01:04:03 所属栏目:百科 来源:网络整理
导读:介绍 对于Java,依赖注入工作作为纯OOP,即你提供一个接口被实现,在你的框架代码接受实现定义的接口的类的实例。 现在对于Python,你能够做同样的方式,但我认为该方法是太多的开销,在Python的情况下。那么,你将如何实现它的Pythonic方式? 用例 说这是框
介绍

对于Java,依赖注入工作作为纯OOP,即你提供一个接口被实现,在你的框架代码接受实现定义的接口的类的实例。

现在对于Python,你能够做同样的方式,但我认为该方法是太多的开销,在Python的情况下。那么,你将如何实现它的Pythonic方式?

用例

说这是框架代码:

class FrameworkClass():
    def __init__(self,...):
        ...

    def do_the_job(self,...):
        # some stuff
        # depending on some external function

基本方法

最幼稚的(也许最好的?)方法是要求将外部函数提供给FrameworkClass构造函数,然后从do_the_job方法中调用。

框架代码:

class FrameworkClass():
    def __init__(self,func):
        self.func = func

    def do_the_job(self,...):
        # some stuff
        self.func(...)

客户代码:

def my_func():
    # my implementation

framework_instance = FrameworkClass(my_func)
framework_instance.do_the_job(...)

问题很短。有没有更好的常用的Pythonic方法来做到这一点?或者支持这样的功能的任何库?

更新:具体情况

想象一下,我开发了一个微型网络框架,它使用令牌处理身份验证。这个框架需要一个函数来提供从令牌获得的一些ID,并获得对应于该ID的用户。

显然,框架不知道关于用户或任何其他应用程序特定逻辑的任何东西,所以客户端代码必须注入用户getter功能到框架中,以使身份验证工作。

有关如何使用超级和多重继承而不是DI的参数,请参见 Raymond Hettinger – Super considered super! – PyCon 2015。如果你没有时间观看整个视频,跳到分钟15(但我建议看看所有)。

以下是一个如何将此视频中所述内容应用于您的示例的示例:

框架代码:

class TokenInterface():
    def getUserFromToken(self,token):
        raise NotImplementedError

class FrameworkClass(TokenInterface):
    def do_the_job(self,...):
        # some stuff
        self.user = super().getUserFromToken(...)

客户代码:

class SQLUserFromToken(TokenInterface):
    def getUserFromToken(self,token):      
        # load the user from the database
        return user

class ClientFrameworkClass(FrameworkClass,SQLUserFromToken):
    pass

framework_instance = ClientFrameworkClass()
framework_instance.do_the_job(...)

这将工作,因为Python MRO将保证getUserFromToken客户端方法被调用(如果使用super())。如果你使用Python 2.x,代码将不得不改变。

这里的另一个好处是,如果客户端不提供实现,这将引发异常。

当然,这不是真正的依赖注入,它是多继承和mixins,但它是一个Pythonic的方式来解决你的问题。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读