尝试注册zope.interface的实现时出错

时间:2017-01-29 20:36:05

标签: python python-3.x zope zope.interface zope3

我有下一堂课:

@implementer(ISocial)
class SocialVKSelenium:
    pass

当我将它添加到zope注册表中时:

gsm = getGlobalSiteManager()
gsm.registerAdapter(SocialVKSelenium)

我得到了:TypeError: The adapter factory doesn't have a __component_adapts__ attribute and no required specifications were specified

当我添加适配器(IOther)时,注册按预期工作,但没有。为什么会这样?

1 个答案:

答案 0 :(得分:2)

您需要在班级或注册表中提供上下文。

我怀疑您没有在整个问题集中进行通信 - 适配器是一个适应指定接口对象的组件,并提供另一个。您的示例未能指定要调整的上下文是什么,即,在其类的构造适配器对象时适应哪种对象?

例如,这很好用:

from zope.interface import Interface, implements
from zope.component import getGlobalSiteManager, adapts


class IWeight(Interface):
    pass


class IVolume(Interface):
    pass

class WeightToVolume(object):
    implements(IVolume)
    adapts(IWeight)
    #...


gsm = getGlobalSiteManager()
gsm.registerAdapter(WeightToVolume)

虽然您可以使用装饰器(实现者/适配器)语法,但按照惯例,对于类,而不是函数的适配器工厂,最好使用implements / adapts。

如果你的适配器没有声明它在类或工厂函数本身上的适应性,那么你至少需要告诉注册表。在最广泛的情况下,这可能看起来像:

gsm.registerAdapter(MyAdapterClassHere, required=(Interface,))

当然,上面这个例子是一个声称可以适应任何上下文的适配器,除非你知道为什么需要它,否则不推荐使用。