维护可用行为注册表的框架
项目描述
概述
本包提供了对 行为 的支持。
行为是对象的可复用方面,可以在不更改组件注册的情况下启用或禁用。
行为由接口描述,并具有元数据,如标题和描述。可以通过给定的短名称或接口的点名称查找行为。使用此唯一名称可以查找行为元数据。当行为对对象启用时,您将能够将对象适配到接口。在某些情况下,接口也可以用作标记接口。
例如,假设您的应用程序需要支持对象级别的锁定。这可以通过适配器来建模,但您希望在运行时确定特定对象是否启用锁定。然后,您可以将锁定注册为行为。
需求和限制
本包包含了对注册行为和工厂的支持。
它没有实现确定特定对象在特定时间启用哪些行为的策略。此决策推迟到 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
如果设置为 yes 或 true,则仅在该给定名称下注册行为,而不是在 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;
一个实现 IMyBehavior 的 MyFactory 类;
一个实现 IMyBehavior 和 plone.behavior.interfaces.ISchemaAwareFactory 的 MySchemaAwareFactory 类;
一个打算用作 for 的 IMyType;
某个 typed_context(某些任意对象),它是 IBehaviorAssignable 并提供 IMyType 的;
一个实现 IMyBehavior 并适配 IMyType 的 MyTypedFactory 类。
title 和 description 很简单,所以在这里不详细说明。我们也不讨论 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" />
marker 与 provides 相同,
使用 behavior = IMyBehavior(context),将返回一个 MyFactory 实例,
context 提供了 IMyBehavior,
MyFactory 实例提供了 IMyBehavior,
如果 context 和 MyFactory 都提供相同的接口,那么这将显得很糟糕且不被推荐!
示例 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),它无法适配并且 behavior 为 None,
使用 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),它无法适配并且 behavior 为 None,
使用 behavior = IMyBehavior(typed_context),将返回一个 MyFactory 实例,
context 提供了 IMyMarker,
MyFactory 实例提供了 IMyBehavior,
进一步阅读
有关更多详细信息,请阅读源代码中的 doctests:behavior.rst,directives.rst 和 annotation.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
在 BSD 许可下重新许可。请参阅 http://plone.org/foundation/materials/foundation-resolutions/plone-framework-components-relicensing-policy [davisagli]
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | abad04798d1f6f1a5e67e5b51f4169640db50210fa81223e87a45c7d47544aba |
|
MD5 | ad1f45b1e7664fff54368fca47fed880 |
|
BLAKE2b-256 | 8c126405b8e23561a23eaec78a62fedc13ae276b3eae90fe1ca1bd62f9615230 |
plone.behavior-2.0.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2befc5c45a0a645bbc07dd56ac248a2b384fb0dee0390e010b3158fcfebb20f7 |
|
MD5 | 413608b4930a20e9264c326c14bab66c |
|
BLAKE2b-256 | 70a2c1bc62639a25f0e96f8787cb5f05040d606a9c4a43f9f09e9c3877dbb502 |