Как мне получить список классов, которые реализуют интерфейс? (Zope.interface) - PullRequest
3 голосов
/ 06 августа 2011

Вопрос говорит обо всем.Или я пытаюсь использовать zope.interface для неправильной цели?

В основном мне нужен One Way To It для регистрации классов, реализующих определенную функциональность (виджеты или портлеты для CMS).В основном, как django делает с классами ModelAdmin, но не автоматически и не волшебно.

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

Это то, что решает архитектура zope.component, но вы должны зарегистрировать все виды использования интерфейса.Само по себе zope.interface не отслеживает, какие объекты реализуют данный интерфейс.

То, что вы ищете, это регистрация утилит ;все реализации данного сервиса, определенные интерфейсом.

1 голос
/ 14 февраля 2016

Самый простой подход - это декорировать 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

Обратите внимание, что вы должны сделать это до того, как будут реализованы интерфейсы, которые вы хотите перехватить, обычно лучше всегосделайте это, прежде чем импортировать что-либо еще.

...