Расхождение компонентов Zope между интерфейсом (obj) и getAdapter(объект, интерфейс)
Что может заставить Interface(obj) возвращать obj, в то время как getAdapter(obj, Interface) возвращает правильно адаптированный объект?
1 ответ
Решение
Если данный экземпляр уже предоставляет интерфейс, то IInterface(instance)
вернет переданный экземпляр. Ведь это уже удовлетворяет требованию, вы можете использовать instance
напрямую, если вам нужно использовать IInterface
методы:
>>> import zope.interface
>>> class IFoo(zope.interface.Interface):
... pass
...
>>> class Foo(object):
... zope.interface.implements(IFoo)
... pass
...
>>> foo = Foo()
>>> IFoo(foo)
<__main__.Foo object at 0x10eed22d0>
>>> IFoo.providedBy(foo)
True
getAdapter()
переходит непосредственно в реестр адаптеров, и если вы зарегистрировали адаптер для данного класса, IInterface
тогда этот адаптер будет возвращен. Это несколько бессмысленно, поскольку исходный объект уже предоставил интерфейс, поэтому адаптация не требовалась.