将实例方法包装在持久化工厂包装器中,以便将实例方法用作ZCA工厂。
项目描述
;--Doctest--
z3c.persistentfactory
ZCA和ZODB是一个很好的组合,其中组件需要持久状态。ZCA工厂或处理器通常从被适配的持久对象中检索所需的任何持久状态。如果所需的持久状态不是特定于被适配的对象,一个常见的解决方案是注册一个持久实用程序,然后在工厂或处理器中进行查找。然而,持久实用程序方法需要查找一个适当的实用程序,这要求在ZCA注册中提供支持,无论是在接口提供还是在实用程序名称。
然而,在某些情况下,将工厂或处理器视为持久对象的实例方法是更符合Python和ZCA的面向对象语义的。这种方法可以在self上访问非上下文特定的持久状态。
实例方法事件处理器
这可能有用的一个例子是,某些非上下文持久状态与某些事件处理器紧密耦合,在这种情况下,实例方法具有更好的语义。
“Baz”类在Python代码中使用装饰器。请注意,工厂装饰器必须放在声明装饰器之前,以确保它在最后运行并反映声明。
>>> from z3c.persistentfactory import testing >>> baz = testing.Baz()
将持久化工厂包装的实例方法注册为处理器。
>>> from zope import component >>> component.provideHandler(factory=baz.factory)
该方法适配IFoo,因此创建一个提供IFoo的对象用作事件。
>>> component.adaptedBy(baz.factory) (<InterfaceClass z3c.persistentfactory.testing.IFoo>,)>>> from zope import interface >>> foo = testing.Foo() >>> interface.alsoProvides(foo, testing.IFoo)
当事件被通知时,方法作为参数调用事件。
>>> import zope.event >>> zope.event.notify(foo) Called <bound method Baz.factory of <z3c.persistentfactory.testing.Baz object at ...>> args: (<z3c.persistentfactory.testing.Foo object at ...>,) kwargs: {}
实例方法适配器工厂
另一个例子是,适配器工厂需要查找适配对象的特定持久状态,但该状态不能存储在适配对象自身上。存储共享持久状态的组件可以将其一个实例方法注册为适配器工厂,该工厂将在self上查找必要的持久状态。
将持久化工厂包装的实例方法注册为适配器工厂。
>>> component.provideAdapter(factory=baz.factory)
该方法实现IBar。
>>> tuple(interface.implementedBy(baz.factory)) (<InterfaceClass z3c.persistentfactory.testing.IBar>,)
当查找适配器时,该方法作为参数调用要适配的对象。
>>> result = component.getAdapter(foo, testing.IBar) Called <bound method Baz.factory of <z3c.persistentfactory.testing.Baz object at ...>> args: (<z3c.persistentfactory.testing.Foo object at ...>,) kwargs: {} >>> result (<bound method Baz.factory of <z3c.persistentfactory.testing.Baz object at ...>>, (<z3c.persistentfactory.testing.Foo object at ...>,), {})
变更日志
0.3 - 2008-04-10
声明者的声明不跟踪类方法声明的变化。
将声明者的类上的声明与实例上的声明隔离开来。
0.2 - 2008-04-09
改进README.txt,以提供更清晰的示例。
0.1 - 2008-04-08
首次发布
项目详情
关闭
z3c.persistentfactory-0.3.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cd3448542887b82c0ce94258403df34aeaf9325e4c963fcda0dc1df083128573 |
|
MD5 | e25bb82c332acedde04b2b40f07562e5 |
|
BLAKE2b-256 | c6bc66183618a4cec252675760f47fb39077999eab1beb2befc5098f5141bbb9 |