擅长:python、mysql、java
<p>@Dan的回答非常透彻,但只是为了增加讨论:</p>
<p>我是一个从函数范围中删除样板代码的装饰器的忠实粉丝。在</p>
<p>虽然将依赖项作为另一个参数非常简单,但它添加了无关的代码以确保在大多数上下文中初始化所有依赖项。在</p>
<p>也就是说,我维护了一个模块来处理这个问题:<a href="https://github.com/allrod5/injectable" rel="nofollow noreferrer">Injectable</a>,它为Python 3提供了一个<code>@autowired</code>修饰符,以实现简单而干净的依赖注入:</p>
<ul>
<li>该功能完全不必知道自动布线</li>
<li>依赖项可以延迟初始化</li>
<li>如果需要,调用者能够显式地传递依赖关系实例</li>
</ul>
<p>decorator的全部目的是<strong>像这样转换代码</strong>:</p>
<pre><code>def __init__(self, *, model: Model = None, service: Service = None):
if model is None:
model = Model()
if service is None:
service = Service()
self.model = model
self.service = service
# actual code
</code></pre>
<p><strong>进入这个</strong>:</p>
^{2}$
<p>没有复杂的东西,没有设置,没有强制执行的工作流。现在你的函数代码不再是依赖初始化代码的混乱了。在</p>
<p>装饰方法非常简约。也许一个成熟的框架更适合你。为此,有一些优秀的模块,如<a href="https://github.com/alecthomas/injector" rel="nofollow noreferrer">Injector</a>。在</p>