2013-01-04 41 views
1

當我做一個接口IB繼承IA我所期望的,然後使用interface.providedBy()查詢的B一個實例(它實現IB),我會在列表中看到兩個IAIB。但是,情況似乎並非如此。Zope接口繼承:爲什麼不在interface.providedBy()中顯示?

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) 

回答