1

我希望当我使接口IB继承自IA,然后用于查询(实现)interface.providedBy()的实例时,我会在列表中看到和。然而,情况似乎并非如此。BIBIAIB

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,如输出的第一行所示,为什么没有IA出现在输出的第二行?

更新:我通过使用以下解决方法解决了这个问题。我没有兴趣查看任何提供程序类、基类 (zope.interface.Interface) 或结果中的任何类型的重复项,所以我做了以下操作。

def getAllInterfaces(obj):
    all_ifaces = set()

    def buildSet(ifaces):
        for iface in ifaces:
            if iface != interface.Interface:
                all_ifaces.add(iface)
                buildSet(iface.__bases__)

    buildSet(list(interface.providedBy(obj)))
    return tuple(all_ifaces)
4

2 回答 2

2

providedBy 只返回立即提供的接口。有关如何获取所有接口的示例,请参见https://github.com/Pylons/substanced/blob/master/substanced/util/init .py #L398 。

于 2013-01-06T01:15:05.827 回答
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

于 2020-03-10T10:04:42.257 回答