5

質問がすべてを物語っています。それともzope.interface、間違った目的で使用しようとしていますか?

基本的に必要なのは、特定の機能 (CMS のウィジェットまたはポートレット) を実装するクラスを登録するための One Way To Do It です。基本的に、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 に答える