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