问题说明了一切。或者我是否尝试将zope.interface
用于错误的目的?
我需要的是基本的单向操作方法,用于注册实现特定功能的类(CMS的小部件或Portlet)。基本上就像django的ModelAdmin类一样,但不是自动的而不是魔术。
答案 0 :(得分:3)
这是zope.component
架构解决的问题,但您必须注册接口的所有用途。 zope.interface
本身并不跟踪哪些对象实现给定的接口。
您正在寻找的是utility registrations;接口定义的给定服务的所有实现。
答案 1 :(得分: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
请注意,您必须在实现要捕获的接口之前执行此操作,通常最好在导入其他任何内容之前执行此操作。