当前位置: 首页 > 面试题库 >

Python依赖注入的方式是什么?

林鸿彩
2023-03-14
问题内容

对于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方法来做到这一点?也许有任何支持这种功能的库?

更新:具体情况

想象一下,我开发了一个微型Web框架,该框架使用令牌处理身份验证。该框架需要一个功能,以提供ID从令牌中获取的一些令牌,并获取与之相对应的用户ID

显然,框架对用户或任何其他特定于应用程序的逻辑一无所知,因此客户端代码必须将用户获取器功能注入框架中以使身份验证工作。


问题答案:

参见Raymond Hettinger-超级超级!-PyCon
2015
,有关如何使用超级继承和多重继承而不是DI的争论。如果您没有时间观看整个视频,请跳至第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())。如果您使用的是Python2.x,则必须更改代码。

此处的另一个好处是,如果客户端不提供实现,则会引发异常。

当然,这并不是真正的依赖注入,它是多个继承和混合,但这是解决问题的Python方法。



 类似资料:
  • 问题内容: 已经发布了几个问题,其中包括有关依赖项注入的特定问题,例如何时使用它以及支持它的框架。然而, 什么是依赖项注入?何时/为什么/不应该使用它? 问题答案: 依赖注入 将依赖传递给其他 对象 或 框架 (依赖注入器)。 依赖注入使测试更加容易。注入可以通过 构造函数 完成。 其构造函数如下: 问题 :如果涉及复杂的任务,例如磁盘访问或网络访问,则 很难 对其进行单元测试。程序员必须进行模拟

  • 考虑下面的代码: 上面的代码是一个表示一个汉堡包类。 该类假设汉堡包括Bun, Patty 和 Toppings。 该类还负责制作Bun, Patty 和 Toppings。 这是一件坏事。 如果需要素食汉堡怎么办? 一个天真的方法可能是: 好吧,这有点不同,它在某些方面更灵活,但它仍然相当脆弱。 如果Patty构造函数改变以允许新的功能会发生什么? 整个汉堡包类必须更新。 事实上,任何时候任何这

  • 问题内容: 我想知道 _什么是Spring Framework? 为什么和何时应该在Java Enterprise开发中使用它? _ 答案将是“依赖注入框架”。好了,使用依赖注入框架时我们有什么优势?用setter值和/或构造函数参数描述类的想法对我来说似乎很奇怪。为什么这样 因为我们可以更改属性而无需重新编译项目?这就是我们所获得的一切吗? 那么,我们应该用什么对象来描述?所有对象还是只有几个?

  • 问题内容: 我了解依赖注入本身的好处。让我们以Spring为例。我还了解其他Spring功能(如AOP,不同类型的助手等)的好处。我只是想知道XML配置的好处是什么,例如: 与普通的旧Java代码相比,例如: 它更容易调试,检查编译时间,并且仅懂Java的任何人都可以理解。那么,依赖注入框架的主要目的是什么?(或一段显示其优点的代码。) 如果 如果有多个,IoC框架如何猜测要注入的myServic

  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮