冻结对象的模式
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'