冻结对象的模式

zc.freeze的Python项目详细描述


freeze包提供了冻结对象的模式。 状态是信息性的—未指定强制执行。 包括一些执法方法和帮助人员。

Detailed Documentation

Freezing

此包实现冻结对象的基本功能: 用于查询对象是否可以冻结的拼写,用于查询对象是否可以冻结 已经被冻结了,实际上冻结了一个物体。进一步的政策可能 在这个包的基本代码之上实现;并且 此包中的代码作为可插入选项提供,可以 在保留基本api时省略。

若要发现对象是否可自由释放,客户端代码应询问 提供zc.freeze.interfaces.ifreezable。

声明对象可ifreezable的站点配置或代码 确保对象提供或能够适应 zc.freeze.interfaces.ifreezing.冻结界面。此接口只有三个元素: _ z_frozen是一个只读布尔值,返回对象是否 versioned;_z_freeze_datetime是pytz.utc中的只读日期时间 指定冻结对象的时间(如果对象尚未冻结,则指定“无 冻结);而冻结是一种实际冻结对象的方法。如果 对象已冻结,它将引发 zc.freeze.interfaces.frozenerror。如果对象不处于 冻结时,它可能会引发zc.freeze.interfaces.freezeerror。如果冰冻 可能成功,方法应发送 zc.freeze.interfaces.iobjectFrozenEvent(例如 zc.freeze.interfaces.objectFrozenEvent)。

这就是软件包的核心:一个api和一个协议,不需要测试 直接的。这个包不直接支持的一个策略是 冻结对象可能首先创建一个副本,然后对副本进行版本转换 而不是原件;或将原件改版,但在 原稿的位置;或做出任何其他选择。这些方法是 打算在zc.freeze api之上实现。这个 包提供了更简单的功能。

Conveniences

这个包提供了两个ifreezing的默认实现,以及一些 方便。

一个ifreezing实现是针对直接意识到这一点的对象 api(与从适配器和其他 组件)。

>>> import zc.freeze
>>> v = zc.freeze.Freezing()
>>> from zc.freeze import interfaces
>>> from zope.interface.verify import verifyObject
>>> verifyObject(interfaces.IFreezing, v)
True
>>> verifyObject(interfaces.IFreezable, v)
True
>>> v._z_frozen
False
>>> v._z_frozen = True
Traceback (most recent call last):
...
AttributeError: can't set attribute
>>> import pytz
>>> import datetime
>>> before = datetime.datetime.now(pytz.utc)
>>> v._z_freeze()
>>> before <= v._z_freeze_timestamp <= datetime.datetime.now(pytz.utc)
True
>>> v._z_frozen
True
>>> interfaces.IObjectFrozenEvent.providedBy(events[-1])
True
>>> events[-1].object is v
True
>>> v._z_freeze()
Traceback (most recent call last):
...
FrozenError

另一个可用的实现是适配器,它将信息存储在 注解。这是一个快速演示。

>>> import zope.annotation.interfaces
>>> from zope import interface, component
>>> class Demo(object):
...     interface.implements(zope.annotation.interfaces.IAnnotatable)
...
>>> import UserDict
>>> class DemoAnnotations(UserDict.UserDict):
...     interface.implements(zope.annotation.interfaces.IAnnotations)
...     component.adapts(Demo)
...     def __init__(self, context):
...         self.context = context
...         self.data = getattr(context, '_z_demo', None)
...         if self.data is None:
...             self.data = context._z_demo = {}
...
>>> component.provideAdapter(DemoAnnotations)
>>> component.provideAdapter(zc.freeze.FreezingAdapter)
>>> d = Demo()
>>> verifyObject(interfaces.IFreezing, interfaces.IFreezing(d))
True
>>> verifyObject(interfaces.IFreezable, interfaces.IFreezing(d))
True
>>> interfaces.IFreezing(d)._z_frozen
False
>>> interfaces.IFreezing(d)._z_frozen = True
Traceback (most recent call last):
...
AttributeError: can't set attribute
>>> before = datetime.datetime.now(pytz.utc)
>>> interfaces.IFreezing(d)._z_freeze()
>>> (before <= interfaces.IFreezing(d)._z_freeze_timestamp <=
...  datetime.datetime.now(pytz.utc))
True
>>> interfaces.IFreezing(d)._z_frozen
True
>>> interfaces.IObjectFrozenEvent.providedBy(events[-1])
True
>>> events[-1].object is d
True
>>> interfaces.IFreezing(d)._z_freeze()
Traceback (most recent call last):
...
FrozenError

freeze模块还包含三个用于编写属性和 冷冻感知的方法。

“method”函数可以生成一个冻结感知方法,该方法引发 如果对象已冻结,则返回frozenerror。

“setproperty”和“delproperty”函数可以生成冻结感知 在调用set或del方法时引发frozenerror的描述符 在冰冻的物体上。这些是rwproperties。

“makeproperty”生成一个冻结感知描述符,它执行一个简单的 获取/设置,但如果在冻结的 反对。

>>> class BiggerDemo(Demo):
...     counter = 0
...     @zc.freeze.method
...     def increase(self):
...         self.counter += 1
...     _complex = 1
...     @property
...     def complex_property(self):
...         return str(self._complex)
...     @zc.freeze.setproperty
...     def complex_property(self, value):
...         self._complex = value * 2
...     zc.freeze.makeProperty('simple_property')
...
>>> d = BiggerDemo()
>>> d.counter
0
>>> d.complex_property
'1'
>>> d.simple_property # None
>>> d.increase()
>>> d.counter
1
>>> d.complex_property = 4
>>> d.complex_property
'8'
>>> d.simple_property = 'hi'
>>> d.simple_property
'hi'
>>> interfaces.IFreezing(d)._z_frozen
False
>>> interfaces.IFreezing(d)._z_freeze()
>>> interfaces.IFreezing(d)._z_frozen
True
>>> d.counter
1
>>> d.increase()
Traceback (most recent call last):
...
FrozenError
>>> d.counter
1
>>> d.complex_property
'8'
>>> d.complex_property = 10
Traceback (most recent call last):
...
FrozenError
>>> d.complex_property
'8'
>>> d.simple_property
'hi'
>>> d.simple_property = 'bye'
Traceback (most recent call last):
...
FrozenError
>>> d.simple_property
'hi'

CHANGES

1.2 (2011-04-08)

  • 已更新测试以使用ZTK1.0运行。
  • 使用python的doctest模块而不是不推荐的 zope.testing.doctest
  • 取决于更新的bug修复版本zope.locking。

1.1

(支持Zope 3.4/鸡蛋)

1.1b

改为支持鸡蛋

1.0

(支持Zope 3.3/无蛋)

1.0.1

删除了包含的rwproperty.py并添加了依赖项,如下所示 跑道现在可以从pypi获得roperty。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java爬虫获取外部网站搜索结果   java Bluestack未连接到eclipse   java如何从ConstraintViolationException Hibernamte获取数据库字段名   HttpResponse HttpResponse=httpClient引发java运行时错误。执行(httpPost);   Jama中矩阵的java点积和叉积   java有什么方法可以唯一地识别可扩展设备吗?   java我需要用*来写我的名字,但我不断遇到一个错误,我对编码很陌生   java变量是在内部类中访问的。需要被宣布为最终决定。但我不想宣布最终结果   java如何缩短base64图像字符串,Android?   JavaSpringMVC:计划方法不自动触发   图形学习Java 2D API的好资源是什么?   如何在java中对方法进行排队   java JavaFX多行   java Selenium无法在[链接]上找到基于CSS元素的密码字段元素http://www.cartasi.it/gtwpages/index.jsp   Java中的equals()和hashCode()契约   软删除情况下的java Hibernate二级缓存   java为什么这段代码要两次调用这些方法?