Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解Zope组件体系结构和组件依赖性_Python_Zope_Zope.component - Fatal编程技术网

Python 理解Zope组件体系结构和组件依赖性

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

我的问题很难有一个好标题。 据我所知,适配器是在不改变组件的情况下向组件添加更多服务。适配器可以从多个组件扩展服务

但是组件之间的依赖关系呢?如何设置组件A(Person)和组件B(Task)之间的依赖关系,就像这段普通Python代码一样

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不会为您强制执行该依赖关系。