这个问题说明了一切。或者我试图将zope.interface用于错误的目的?
我需要的基本上是注册实现特定功能的类(CMS的小部件或Portlet)的一种方法。基本上就像django使用它的ModelAdmin类一样,但不是自动的,也不是魔术的。
发布于 2011-08-06 20:07:13
这就是zope.component架构所解决的问题,但是您必须注册接口的所有使用。zope.interface本身并不跟踪哪些对象实现了给定的接口。
您正在寻找的是utility registrations;由接口定义的给定服务的所有实现。
发布于 2016-02-14 17:17:06
最简单的方法是修饰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请注意,您必须在实现要捕获的接口之前执行此操作,通常最好在导入任何其他接口之前执行此操作。
https://stackoverflow.com/questions/6962712
复制相似问题