【发布时间】:2015-10-19 03:47:06
【问题描述】:
简介
对于 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对应的用户。
显然,框架对用户或任何其他应用程序特定逻辑一无所知,因此客户端代码必须将用户 getter 功能注入框架以使身份验证工作。
【问题讨论】:
-
你为什么不“提供一个要实现的接口,并在你的框架代码中接受一个实现定义接口的类的实例”?在 Python 中,您可以以 EAFP 样式执行此操作(即假设它满足该接口,否则会引发
AttributeError或TypeError),但除此之外它是相同的。 -
使用
abs的ABCMeta元类和@abstractmethod装饰器很容易做到这一点,无需手动验证。只是想获得几个选项和建议。您引用的那个是最干净的,但我认为开销更大。 -
那我不知道你想问什么问题。
-
好的,换个说法我试试。问题很清楚。问题是如何以 Pythonic 方式做到这一点。 选项1:您引用的方式,选项2:基本方法我在问题中描述。所以问题是,还有其他 Pythonic 方法吗?
标签: python oop authentication dependency-injection frameworks