5

这个问题说明了一切。还是我试图zope.interface用于错误的目的?

我需要的基本上是一种方法来注册实现特定功能的类(CMS 的小部件或 Portlet)。基本上就像 django 的 ModelAdmin 类一样,但不是自动的,也不是魔术。

4

2 回答 2

3

这是zope.component架构解决的问题,但您必须注册接口的所有用途。它本身zope.interface不会跟踪哪些对象实现了给定的接口。

您正在寻找的是实用程序注册;由接口定义的给定服务的所有实现。

于 2011-08-06T12:07:12.633 回答
1

最简单的方法是装饰zope.interface.declarations.classImplements(及其别名zope.interface.classImplements)。

from zope import interface as i
from collections import defaultdict
oclassImplements = i.classImplements
registry = defaultdict(list)
def classImplements(cls, *interfaces):
    for a in interfaces:
        registry[a].append(cls)
    return oclassImplements(cls, *interfaces)
i.classImplements = i.declarations.classImplements = classImplements

请注意,您必须在实现要捕获的接口之前执行此操作,通常最好在导入其他任何内容之前执行此操作。

于 2016-02-14T09:17:06.427 回答