Python 理解Zope组件体系结构和组件依赖性
我的问题很难有一个好标题。 据我所知,适配器是在不改变组件的情况下向组件添加更多服务。适配器可以从多个组件扩展服务 但是组件之间的依赖关系呢?如何设置组件A(Person)和组件B(Task)之间的依赖关系,就像这段普通Python代码一样Python 理解Zope组件体系结构和组件依赖性,python,zope,zope.component,Python,Zope,Zope.component,我的问题很难有一个好标题。 据我所知,适配器是在不改变组件的情况下向组件添加更多服务。适配器可以从多个组件扩展服务 但是组件之间的依赖关系呢?如何设置组件A(Person)和组件B(Task)之间的依赖关系,就像这段普通Python代码一样 class Person: pass class Task: def __init__(self, person): self.owner = person 如果我实现这两个类 from zope.interface import Interfa
class Person:
pass
class Task:
def __init__(self, person):
self.owner = person
如果我实现这两个类
from zope.interface import Interface
from zope.interface import implements
class IPerson(Interface):
pass
class Person(object):
implements(IPerson)
class ITask(Interface):
pass
class Task(object):
implements(ITask)
def __init__(self, person):
self.owner = person
这是一个好的实现吗?关键是,使用ZCA,您不会将依赖项设置为具体对象。你用实用工具代替 对象A将实现一个接口,您在B中查找接口以找到具体的实现,可以是A,但这取决于寄存器 请注意,ZCA旨在允许您为给定接口插入不同的实现,并不总是需要的 如果任务对象需要特定的类型,则记录该类型。这里不要求使用ZCA。最多,您可以尝试将传入的值调整为
IPerson
;如果传入的对象已实现该接口,则该操作为no op:
class Task(object):
implements(ITask)
def __init__(self, owner):
self.owner = IPerson(owner)
这将允许您稍后灵活地传递其他内容,这些内容本身不是个人,但可以适应该界面。我已更新了上面的问题。我的问题是,实例A需要一个B的实例。如果我使用该实用程序,我如何知道注册服务处理的B的实例对应于A@HOAINAMNGUYEN:你说的是API合同,不是组件体系结构。ZCA不强制执行接口,它只是将它们用作(强大的)注册和查找密钥。任务对象只能与IPerson对象一起工作这一事实是您需要记录的,ZCA不会为您强制执行该依赖关系。