在 Python 中对协议使用 PEAK
2007-03-30 12:25:16 来源:WEB开发网不过,等一下。在我们的 dict 和 tuple 对象中用到的所有的整数是怎么处理的呢? long 、 complex、 float 和 bool 类型的数字有显式的适配器,不过 int 一个都没有。这里的技巧在于, int 对象已经拥有一个 .__repr__() 方法;通过将隐式支持声明为 ILisp 接口的一部分,我们可以巧妙地使用对象已有的 .__repr__() 方法作为对 ILisp 接口的支持。实际上,作为一个内置的类型,整数用不加任何修饰的阿拉伯数字表示,而不使用大写的类型初始器(比如 LONG )。
适配协议
让我们来更明确地看一下 protocol.adapt() 函数都做了什么事情。在我们的例子中,我们使用“声明 API(declaration API)”来隐式地为适配设置了一组“工厂(factories)”。这个 API 有几个层次。声明 API 的“基本层次(primitives)”是函数: declareAdaptorForType() 、 declareAdaptorForObject() 和 declareAdaptorForProtocol() 。前面的例子中没有用到这些,而是用到了一些高层次的 API,如 declareImplementation() 、 declareAdaptor() 、 adviceObject() 和 protocolForType() 。在一种情况下,我们看到在一个类体中有“奇妙”的 advise() 声明。 advise() 函数支持用于配置那些建议的类的目的和角色的大量关键字参数。您还可以建议 (advise()) 一个模块对象。
您不需要使用声明 API 来创建知道如何使对象适配( adapt() )自己的可适配的对象或者接口。让我们来看 adapt() 的调用标记,然后解释它随后的过程。对 adapt() 的调用类似这样:
adapt() 的调用标记
adapt(component, protocol, [, default [, factory]])
这就表示您希望让对象 component 去适配接口 protocol 。如果指定了 default ,它可以返回为一个包装对象(wrapper object)或者对 component 的修改。如果 factory 被指定为一个关键字参数,那么会使用一个转换工厂来生成包装或者修改。不过让我们先退回一点,来看一下 adapt() 尝试的完整的动作次序(简化的代码):
更多精彩
赞助商链接