2013-01-04 1 views
1

Je me attends quand je fais une interface IB Hériter de IA, puis utilisez interface.providedBy() pour interroger une instance de B (qui met en œuvre IB), je voyais à la fois IA et IB dans la liste. Cependant, cela ne semble pas être le cas.Héritage de l'interface Zope: Pourquoi n'apparaît-il pas dans 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)) 

exécution de ce code produit la sortie suivante:

Does B() provide IA? True 
providedBy(B()): [<InterfaceClass __main__.IB>] 

Si B() fournit IA, comme le montre la première ligne de sortie, pourquoi ne pas IA apparaissent dans la deuxième ligne de sortie?

MISE À JOUR: J'ai résolu le problème en utilisant la solution de contournement suivante. Je n'avais aucun intérêt à voir les classes du fournisseur, la classe de base (zope.interface.Interface) ou n'importe quel type de doublon dans les résultats, donc j'ai fait ce qui suit.

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) 

Répondre

Questions connexes