跳转到主要内容

维护可用行为注册表的框架

项目描述

概述

本包提供了对 行为 的支持。

行为是对象的可复用方面,可以在不更改组件注册的情况下启用或禁用。

行为由接口描述,并具有元数据,如标题和描述。可以通过给定的短名称或接口的点名称查找行为。使用此唯一名称可以查找行为元数据。当行为对对象启用时,您将能够将对象适配到接口。在某些情况下,接口也可以用作标记接口。

例如,假设您的应用程序需要支持对象级别的锁定。这可以通过适配器来建模,但您希望在运行时确定特定对象是否启用锁定。然后,您可以将锁定注册为行为。

需求和限制

  • 本包包含了对注册行为和工厂的支持。

  • 它没有实现确定特定对象在特定时间启用哪些行为的策略。此决策推迟到 IBehaviorAssignable 适配器,该适配器必须实现(plone.dexterity 实现了这一点)。

  • 类似于 IBehaviorAssignable 管道,标记接口支持需要在每个应用程序的基础上启用。本包也不直接支持将标记接口添加到实例。要执行此操作,您可以使用事件处理程序在创建对象时标记对象,或使用动态的 __providedBy__ 描述符在运行时执行查找(但您可能需要一些缓存)。本包提供了一个示例事件处理程序,但默认情况下未注册。

  • 意图是行为分配在整个应用程序中是通用的,用于多个可选行为。使用 plone.behavior 为单个类型的对象可能没有太多意义。跟踪哪些行为为哪些类型的对象启用的方法将是特定于应用程序的。

用法

解释

行为编写的方式与适配器类似,只是您没有直接指定正在适配的上下文类型。例如

from zope.interface import Interface
from zope.interface import implementer

class ILockingSupport(Interface):
   """Support locking
   """

   def lock():
       """Lock an object
       """

   def unlock():
       """Unlock an object
       """

@implementer(ILockingSupport)
class LockingSupport(object):

    def __init__(self, context):
        self.context = context

    def lock(self):
        # do something

    def unlock(self):
        # do something

此接口(描述行为的类型)和类(描述行为的实现)然后需要注册。

最简单的方法是加载本包中的 meta.zcml 文件并使用 ZCML 来完成此操作。

<configure
  xmlns="http://namespaces.zope.org/zope"
  xmlns:plone="http://namespaces.plone.org/plone"
  i18n_domain="my.package">

  <include package="plone.behavior" file="meta.zcml" />

  <plone:behavior
      name="locking_support"
      title="Locking support"
      description="Optional object-level locking"
      provides=".interfaces.ILockingSupport"
      factory=".locking.LockingSupport"
  />

</configure>

完成此操作后,您可以将上下文适配到 ILockingSupport,就像正常一样。

locking = ILockingSupport(context, None)

if locking is not None:
    locking.lock()

可以使用名称而不是接口的完整点名称进行查找。

from plone.behavior.interfaces import IBehavior
from zope.component import getUtility

registration = getUtility(IBehavior, name='locking_support')

我们还有一个辅助函数来实现这一点

from plone.behavior.registration import lookup_behavior_registration

registration = lookup_behavior_registration(name='locking_support')

如果上下文可以适配到 IBehaviorAssignable(回想一下,这是特定于应用程序的),并且 IBehaviorAssignable 的实现表示此上下文支持此特定行为,则您将获得 LockingSupport 的实例。

还有可能让提供的接口充当标记接口,该接口由实例直接提供。要实现这一点,省略 factory 参数。如果您需要注册为提供特定行为的实例的其他适配器,这很有用。

ZCML 参考

plone:behavior 指令使用命名空间 xmlns:plone="http://namespaces.plone.org/plone"。为了启用它,需要加载其 meta.zcml,使用

<include package="plone.behavior" file="meta.zcml" />

该指令支持以下属性

标题

此行为的用户友好标题(必需)。

描述

此行为的更详细描述(可选)。

提供

可以将此行为适应的接口。这是条件适配器工厂注册为提供的内容(必需)。

名称

此行为的便捷查找名称(可选)。此行为将始终在 provides 属性的点分隔名称下注册。这些通常是长名称。《name》是这个的简称。如果给出了 name,则行为将在此名称下额外注册。无论如何,建议在 name 中使用短命名空间。

name_only

如果设置为 yestrue,则仅在该给定名称下注册行为,而不是在 provides 接口的点分隔路径下。这使得 name 成为必需项。

标记

由行为应用标记接口。如果没有给出 factory,则此为可选项,默认值为 provides 的值。如果给出了 factory,则 marker 是必需的,并且应与 provides 不同——即使没有强制要求。

工厂

此行为的工厂(可选)。如果没有给出工厂,则假定行为上下文提供了 provides 给出的接口。

如果工厂提供 plone.behavior.interfaces.ISchemaAwareFactory,则假定工厂是可调用的。 ISchemaAwareFactory 是一个接口,用于需要使用方案初始化的工厂。它使用 provides 给出的值作为唯一参数调用。然后使用返回的值作为工厂,另一个可调用的对象,可以按需创建适当的行为工厂。

对于

注册条件适配器工厂的对象类型(可选)。如果没有给出 factory,则必须省略。

默认情况下,要么自动检测工厂适配的内容(即使用 @adapter 装饰器),要么回退到 zope.interface.Interface(在 ZCML 中也写作 *)。

必须有一个元素(没有多适配器,也适用于自动检测)。

former_dotted_names

如果在修改行为以更改其点分隔名称的情况下,此字段可用于注册旧名称。因此,可以检索行为之前注册的名称。

如果在调用 lookup_behavior_registration 时未在给定的名称下找到行为,它将查看旧点分隔名称以尝试找到行为。

ZCML 示例

示例用法,给定

  • 某个 context(某些任意对象),它是 IBehaviorAssignable 的;

  • 一个 IMyBehavior 接口,打算用作 provides

  • 一个 IMyMarker 接口,打算用作 marker

  • 一个实现 IMyBehaviorMyFactory 类;

  • 一个实现 IMyBehaviorplone.behavior.interfaces.ISchemaAwareFactoryMySchemaAwareFactory 类;

  • 一个打算用作 forIMyType

  • 某个 typed_context(某些任意对象),它是 IBehaviorAssignable 并提供 IMyType 的;

  • 一个实现 IMyBehavior 并适配 IMyTypeMyTypedFactory 类。

titledescription 很简单,所以在这里不详细说明。我们也不讨论 name,因为它在这个用法中没有影响。为了简化,我们假设 context IBehaviorAssignable 总是支持该行为。为了简化,我们也假设某些魔法将标记接口应用到 context 上,即这由 plone.dexterity 完成。

示例 1 - 仅提供 provides

<plone:behavior
    title="Example 1"
    provides="IMyBehavior"
/>
  • marker 默认为 provides

  • 使用 behavior = IMyBehavior(context),将返回 context 本身,

  • context 提供了 IBehavior

示例 2 - 还提供了 factory,因此需要 marker

<plone:behavior
    title="Example 1"
    provides="IMyBehavior"
    marker="IMyBehavior"
    factory="MyFactory"
/>
  • markerprovides 相同,

  • 使用 behavior = IMyBehavior(context),将返回一个 MyFactory 实例,

  • context 提供了 IMyBehavior

  • MyFactory 实例提供了 IMyBehavior

  • 如果 contextMyFactory 都提供相同的接口,那么这将显得很糟糕且不被推荐!

示例 3 - 在示例 2 中,工厂和 context 都提供了 IMyBehavior。这可能会导致混淆,因此现在使用 marker 更好。

<plone:behavior
    title="Example 1"
    provides="IMyBehavior"
    marker="IMyMarker"
    factory="MyFactory"
/>
  • 使用 behavior = IMyBehavior(context),将返回一个 MyFactory 实例,

  • context 提供了 IMyMarker

  • MyFactory 实例提供了 IMyBehavior

示例 4 - 与示例 3 类似,但使用 MySchemaAwareFactory

<plone:behavior
    title="Example 1"
    provides="IMyBehavior"
    marker="IMyMarker"
    factory="MySchemaAwareFactory"
/>
  • 使用 behavior = IMyBehavior(context),通过调用一个以 IMyBehavior 作为参数的 MySchemaAwareFactory 实例,返回一个工厂实例,

  • context 提供了 IMyMarker

  • MyFactory 实例提供了 IMyBehavior

示例 5 - 应将行为限制在 typed_context

<plone:behavior
    title="Example 1"
    provides="IMyBehavior"
    marker="IMyMarker"
    factory="MyFactory"
    for="IMyType"
/>
  • 使用 behavior = IMyBehavior(context, None),它无法适配并且 behaviorNone

  • 使用 behavior = IMyBehavior(typed_context),将返回一个 MyFactory 实例,

  • context 提供了 IMyMarker

  • MyFactory 提供了 IMyBehavior

示例 6 - 应通过自动检测将行为限制在 typed_context 上。使用类装饰器 @adapter(IMyType)MyTypedFactory 类适配 IMyType

<plone:behavior
    title="Example 1"
    provides="IMyBehavior"
    marker="IMyMarker"
    factory="MyTypedFactory"
/>
  • 使用 behavior = IMyBehavior(context, None),它无法适配并且 behaviorNone

  • 使用 behavior = IMyBehavior(typed_context),将返回一个 MyFactory 实例,

  • context 提供了 IMyMarker

  • MyFactory 实例提供了 IMyBehavior

进一步阅读

有关更多详细信息,请阅读源代码中的 doctests:behavior.rstdirectives.rstannotation.rst

源代码

贡献者请阅读文档 Plone 核心开发流程

源代码位于 Github 上的 Plone 代码仓库

变更日志

2.0.1 (2024-01-19)

内部

  • 更新配置文件。 [plone 开发者] (237ff4c8)

2.0.0 (2023-04-15)

破坏性更改

  • 删除对 python 2.7 的支持。 [gforcada] (#1)

内部

  • 更新配置文件。 [plone 开发者] (a9dd65cc)

1.4.0 (2020-09-07)

新功能

  • 删除对 Plone 4.3 的支持。 [maurits] (#3130)

错误修复

  • 修复了 ComponentLookupError 的弃用警告。 [maurits] (#3130)

1.3.2 (2020-04-20)

错误修复

  • 小的打包更新。 (#1)

1.3.1 (2020-03-08)

错误修复

  • 改进了文档。[jensens] (#0)

1.3.0 (2019-02-13)

新功能

  • 新增选项 former_dotted_names,允许注册行为之前使用的旧名称。这在行为点名称更改时确保平稳过渡非常有用。[pysailor] (#18)

1.2.1 (2018-01-17)

错误修复

  • 修复了示例中的点路径导入。[fulv]

1.2.0 (2017-03-23)

新功能

  • 对于 zcml 注册:如果既没有 for 也没有 @adapter,则首先回退到(如果有)标记,否则回退到 Interface(就像之前那样)。[jensens]

错误修复

  • 清理:通过修复问题使 Jenkins CI 代码分析静默。[jensens]

1.1.4 (2016-12-06)

错误修复

  • 将已引入的属性 name 添加到接口 IBehavior 中。这是缺失的。还稍微现代化了其他 IBehavior 接口描述。[jensens]

1.1.3 (2016-11-09)

新功能

  • 支持 Python 3。[davisagli]

1.1.2 (2016-08-11)

新增

  • 新增选项,允许仅通过行为的短名称而不是点名称注册行为。这启用更高级的行为子类化功能。[jensens]

1.1.1 (2016-02-25)

修复

  • 使 doctest 比较对 zope.component __repr__ 变化更健壮。[thet]

1.1 (2015-07-18)

  • 更正了警告中的错误。[jensens]

  • 将名称添加到行为指令中。此名称可用于通过新的 plone.behaviors.registration lookup_behavior_registration 函数查找行为注册。[rnixx]

  • 添加了更多文档,在指令中简化了代码,并在没有 factory 的情况下给出了警告。[jensens]

1.0.3 (2015-04-29)

  • 代码现代化:utf-header,pep8,rst 文件,适配器/实现器装饰器,……[jensens]

1.0.2 (2013-01-17)

  • 移除测试对 zope.app.testing 的依赖。[davisagli]

1.0.1 - 2011-05-20

1.0 - 2011-04-30

  • 使用 stdlib doctest 而不是已弃用的 zope.testing 中的 doctest。[davisagli]

  • 现在使用 MessageID 作为标题和描述的 ‘plone:behavior’ zcml 指令。[sylvainb]

1.0b6 - 2009-11-17

  • 修复了 Zope 2.12 的测试。[optilude]

1.0b5 - 2009-07-12

  • 将 API 方法和参数的名称更改为 mixedCase,以使其与 Zope 的其余部分更一致。这是一个不向后兼容的更改。我们深表歉意,但现在不改变。[optilude]

    如果您在代码中发现导入错误或未知关键字参数,请将名称从 foo_bar 更改为 fooBar,例如 enumerate_behaviors() 变为 enumerateBehaviors()。[optilude]

1.0b4 - 2009-06-07

  • 允许通过使用 <plone:behavior> 指令中的 'provides' 属性(以前称为 'interface')设置仅由标记接口的行为,而无需 'factory' 属性。'marker' 属性(以前称为 'subtype')现在仅在存在标记以及具有单独接口('provides')和工厂的行为适配器时才需要。[optilude]

  • <plone:behavior> 的 'interface' 属性重命名为 'provides',以使其与 <adapter> 指令更一致。这是一个不向后兼容的更改![optilude]

  • <plone:behavior> 的 'subtype' 属性重命名为 'marker',以便更明确其用途。这是一个不向后兼容的更改![optilude]

1.0b3 - 2009-04-17

  • 允许具有无工厂的行为。[alecm]

  • 提供可用行为的词汇表。[davisagli]

1.0b1 - 2008-04-27

  • 初始版本

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定该选择哪个,请了解有关 安装包 的更多信息。

源分发

plone.behavior-2.0.1.tar.gz (27.8 kB 查看哈希值)

上传时间

构建分发

plone.behavior-2.0.1-py3-none-any.whl (24.0 kB 查看哈希值)

上传时间 Python 3

由以下支持