我有一个代码可以使用 get multi 适配器查找 iterface。传递给多适配器的元素成员之一是提供该接口,但不提供元素本身。
我无法控制传递给多适配器的内容,但我可以控制包含其中一个元素的元素。我该如何标记它?通知多适配器那里有一些有用的东西,是否有类似provideAdapterFactory(cls, interface)的东西?
代码示例:
声明
class ImplementsInterface(object):
implements(IMarker)
class Parent(object)
child = ImplementsInterface()
抬头
some_members = zope.component.getMultiAdapter(((Parent()), IMarker)
现在,如果我像这样运行代码,它将产生ComponentLookupError,同时我无法修改查找代码或多适配器,或者就此而言,我无法将 'implements(IMarker) 分配给 Parent,因为 parent 已经实现了不同的接口和会破坏很多其他的东西。
更新:
我想我已经从第 6.1 章多适配器中找到了一个我可以理解的解释
更新 2:我认为我没有在我的单元测试代码中正确初始化 zca,这是一个片段
import unittest2 as unittest
from zope.traversing.adapters import DefaultTraversable
from z3c.form.testing import TestRequest
from z3c.form import testing, field
from zope import component
class TestFunctionalForm(unittest.TestCase):
def setUp(self):
testing.setUp(self)
component.provideAdapter(field.FieldWidgets)
component.provideAdapter(DefaultTraversable, [None])
self.context = self.globs['root']
def tearDown(self):
testing.tearDown(self)