1

インターフェイスIBをから継承し、 (を実装する)のインスタンスをクエリするためにIA使用すると、との両方がリストに表示されると思います。しかし、そうではないようです。interface.providedBy()BIBIAIB

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)
4

2 に答える 2

2

ProvidedByは、すぐに提供されたインターフェイスのみを返します。すべてのインターフェースを取得する方法の例については、https://github.com/Pylons/substanced/blob/master/substanced/util/ init .py#L398を参照してください。

于 2013-01-06T01:15:05.827 に答える
0

提供されているすべてのインターフェースを取得するための短い形式は次のとおりです。

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

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

これは、@ chris-mcdonoughのヒントと、このメソッドに基づいています:https ://github.com/Pylons/substanced/blob/a897f4a0518c51b6e093cc5af39fa326f23752c2/substanced/util/ init .py#L426

于 2020-03-10T10:04:42.257 に答える