gpt4 book ai didi

python - 什么是依赖注入(inject)的 Pythonic 方式?

转载 作者:IT老高 更新时间:2023-10-28 20:21:46 26 4
gpt4 key购买 nike

简介

对于 Java,依赖注入(inject)作为纯 OOP 工作,即您提供一个要实现的接口(interface),并在您的框架代码中接受一个实现已定义接口(interface)的类的实例。

现在对于 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 框架,它使用 token 来处理身份验证。该框架需要一个函数来提供从 token 中获取的一些ID,并获取与该ID对应的用户。

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

最佳答案

Raymond Hettinger - Super considered super! - PyCon 2015关于如何使用 super 继承和多重继承而不是 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())。如果您使用的是 Python 2.x,则必须更改代码。

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

当然,这不是真正的依赖注入(inject),它是多重继承和混合,但它是解决您问题的 Pythonic 方式。

关于python - 什么是依赖注入(inject)的 Pythonic 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31678827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com