我希望当我从[{1}}继承接口IB
时,然后使用IA
查询interface.providedBy()
的实例(实现B
) ,我会在列表中看到IB
和IA
。但是,情况似乎并非如此。
IB
运行此代码会产生以下输出:
from zope import interface
class IA(interface.Interface):
pass
class IB(IA): # We inherit from IA
pass
class B(object):
interface.implements(IB)
if __name__ == '__main__':
b = B()
print 'Does B() provide IA? %s' % IA.providedBy(b)
print 'providedBy(B()): %s' % list(interface.providedBy(b))
如果Does B() provide IA? True
providedBy(B()): [<InterfaceClass __main__.IB>]
提供B()
,如第一行输出所示,为什么IA
不显示在第二行输出中?
更新:我使用以下解决方法解决了该问题。我没有兴趣看到任何提供程序类,基类(zope.interface.Interface)或结果中的任何类型的重复项,所以我做了以下。
IA
答案 0 :(得分:1)
providedBy仅返回立即提供的接口。有关如何获取所有接口的示例,请参阅https://github.com/Pylons/substanced/blob/master/substanced/util/init.py#L398。
答案 1 :(得分:0)
获取所有提供的接口的简写形式是:
from zope.interface.declarations import Declaration
from zope.interface import providedBy
allProvidedInterfaces = list(Declaration(providedBy(b)).flattened())
它基于@ chris-mcdonough的提示以及以下方法:https://github.com/Pylons/substanced/blob/a897f4a0518c51b6e093cc5af39fa326f23752c2/substanced/util/init.py#L426