Zope接口继承:为什么它不会出现在interface.providedBy()中?

时间:2013-01-04 19:37:43

标签: python zope.interface

我希望当我从[{1}}继承接口IB时,然后使用IA查询interface.providedBy()的实例(实现B) ,我会在列表中看到IBIA。但是,情况似乎并非如此。

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

2 个答案:

答案 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