依赖注入的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的方式来解决你的问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |