質問がすべてを物語っています。それともzope.interface
、間違った目的で使用しようとしていますか?
基本的に必要なのは、特定の機能 (CMS のウィジェットまたはポートレット) を実装するクラスを登録するための One Way To Do It です。基本的に、django が ModelAdmin クラスで行うように、自動でも魔法でもありません。
質問がすべてを物語っています。それともzope.interface
、間違った目的で使用しようとしていますか?
基本的に必要なのは、特定の機能 (CMS のウィジェットまたはポートレット) を実装するクラスを登録するための One Way To Do It です。基本的に、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
キャッチしたいインターフェースが実装される前にこれを行う必要があることに注意してください。通常は、他のものをインポートする前にこれを行うのが最善です。