1
當我做一個接口IB
繼承IA
我所期望的,然後使用interface.providedBy()
查詢的B
一個實例(它實現IB
),我會在列表中看到兩個IA
和IB
。但是,情況似乎並非如此。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)
謝謝。不幸的是,這是預期的行爲,因爲我所展示的測試案例似乎導致了不一致的結果。我已經爲問題添加了自己的解決方法。 – Scramblejams