[英]Zope interface inheritance: Why doesn't it show up in interface.providedBy()?
我希望當我讓接口IB
從IA
繼承,然后使用interface.providedBy()
查詢B
的實例(實現IB
)時,我會在列表中看到IA
和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
,如第一行輸出所示,為什么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.