gpt4 book ai didi

python - 用工厂和组件定义的 Zope 实用程序有什么区别?

转载 作者:行者123 更新时间:2023-11-28 22:07:22 27 4
gpt4 key购买 nike

Zope 实用程序的 ZCML 注册可以接受组件或工厂,这有点令人困惑。

<utility component=".some.Class" />

对比

<utility factory=".some.Factory" />

有什么区别?

最佳答案

我认为@lennart-regebro 的回答可能有点无意中具有欺骗性。这是可以理解的,因为 zope 文档有点含糊。我认为以下是正确的解释,但我必须亲自测试才能确定。

组件和工厂中注册每个后续调用 getUtility,在初始注册后,将返回相同的实例

不同之处在于组件方法会将引用的对象注册为要返回的实用程序实例,而工厂方法会调用引用的对象并将结果存储为要返回的实用程序实例。

工厂示例

例如,如果您有一个这样定义的实用程序类;

class MyUtility(object):
implements(IMyUtility)
...

注册它; <utility factory=".my_module.MyUtility"/>

将在执行 zcml 时创建一个 MyUtility 实例并将其存储以供将来调用 getUtility;

> a = getUtility(IMyUtility)
> b = getUtility(IMyUtility)
> c = getUtility(IMyUtility)
> a is b is c
True

请注意,我们可以将工厂注册为函数而不是类,它只需要在不带参数调用时返回您要使用的实用程序实例即可。

组件示例

组件的等效示例是;

class MyUtility(object):
implements(IMyUtility)
...

my_module_instance_of_utility = MyUtility()

注册它; <utility component=".my_module.my_module_instance_of_utility"\>

这或多或少等同于工厂示例。唯一的区别是组件示例中返回的实例是在 my_module 时实例化的。由任何东西(包括注册机制)导入,而当使用工厂时,实例在执行 zcml 配置时实例化,就在注册之前。在这两种情况下,对 getUtility 的后续调用将返回相同的实例。

不要与 IFactory 混淆

不要将这些与 IFactory 混淆,IFactory 确实提供了可以在每次请求时为您提供新实例的东西,但 API 略有不同。参见 this document for more information about those .

关于python - 用工厂和组件定义的 Zope 实用程序有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2135316/

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