这个问题说明了一切。还是我试图zope.interface
用于错误的目的?
我需要的基本上是一种方法来注册实现特定功能的类(CMS 的小部件或 Portlet)。基本上就像 django 的 ModelAdmin 类一样,但不是自动的,也不是魔术。
这个问题说明了一切。还是我试图zope.interface
用于错误的目的?
我需要的基本上是一种方法来注册实现特定功能的类(CMS 的小部件或 Portlet)。基本上就像 django 的 ModelAdmin 类一样,但不是自动的,也不是魔术。
这是zope.component
架构解决的问题,但您必须注册接口的所有用途。它本身zope.interface
不会跟踪哪些对象实现了给定的接口。
您正在寻找的是实用程序注册;由接口定义的给定服务的所有实现。
最简单的方法是装饰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
请注意,您必须在实现要捕获的接口之前执行此操作,通常最好在导入其他任何内容之前执行此操作。