インターフェイス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
、出力の2番目の行に表示されないのはなぜ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)