Расхождение компонентов 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 тогда этот адаптер будет возвращен. Это несколько бессмысленно, поскольку исходный объект уже предоставил интерфейс, поэтому адаптация не требовалась.

Другие вопросы по тегам