簡體   English   中英

Zope 接口繼承:為什么它不顯示在 interface.providedBy() 中?

[英]Zope interface inheritance: Why doesn't it show up in interface.providedBy()?

我希望當我讓接口IBIA繼承,然后使用interface.providedBy()查詢B的實例(實現IB )時,我會在列表中看到IAIB 然而,情況似乎並非如此。

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)

providedBy 只返回立即提供的接口。 https://github.com/Pylons/substanced/blob/master/substanced/util/初始化的.py#L398為如何獲取所有接口的例子。

獲取所有提供的接口的簡短形式是這樣的:

from zope.interface.declarations import Declaration
from zope.interface import providedBy

allProvidedInterfaces = list(Declaration(providedBy(b)).flattened())

它是基於@克里斯-麥克唐納的暗示,這種方法: https://github.com/Pylons/substanced/blob/a897f4a0518c51b6e093cc5af39fa326f23752c2/substanced/util/初始化的.py#L426

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM