如果您正尝试去处理元类,或者正受困于 Twisted 中的异步编程,或者正在研究由于使用了多分派而使您精疲力尽的面向对象编程,那么您完全错了!PEAK 将所有这些中的一些要素组合到了一个组件编程框架中。PEAK 还存在一些小问题。类似于 Twisted,PEAK 的文档 -- 尽量数量巨大 -- 难以看懂。但是尽管如此,关于 Python 领袖 Phillip J. Eby 领导的这一项目还是有一些东西非常值得关注;而且,我觉得,有机会进行极具生产价值的并且层次特别高的应用程序开发。
PEAK 包由许多不同用途的子包组成。一些重要的子包是 peak.api、 peak.binding、 peak.config、 peak.naming 和 peak.storage 。那些名字大部分是自我解释性的。子包 peak.binding 用于组件间的灵活连接; peak.config 让您可以存储“很少改变的(lazily immutable)”数据,这些数据与声明性应用程序(declarative application )编程有关; peak.naming 让您可以为(网络的)资源创建全局惟一的标识符; peak.storage 顾名思义让您可以管理数据库和持久内容。
不过,对本文来说,我们将关注的是 peak.api 。特别是 PyProtocols 包,它可以单独获得并为其他 PEAK 子包提供一个基础设施。在 peak.api.protocols 中包括了 PyProtocols 包的一个版本。不过现在我所感兴趣的是研究一个独立的 protocols 包。在以后的部分,我将返回来讨论 PEAK 其他部分的话题。
什么是协议?
抽象地说,协议只是对象同意遵循的一组行为。强类型(Strongly-typed)编程语言 -- 包括 Python -- 都有一个基本类型的集合,每个基本类型都有一组得到保证的行为:Integer 知道如何去求它们自己的乘积;list 知道如何去遍历它们的内容;dictionary 知道如何根据一个关键字找到相应的值;file 知道如何去读和写字节;诸如此类。您可以预期的内置类型的行为集合构成了它们实现的一个 协议。对协议进行系统化的对象被称为 接口(interface)。
对标准的类型而言,将实现的所有行为全部列出并不太困难(尽管不同的 Python 版本之间会稍有不同;或者,不同的编程语言之间当然会有差别)。但是,在边界 -- 对于属于自定义类的对象来说 -- 难以声明最终是什么构成了“类-dictionary”或“类-file”的行为。大部分情况下,只实现了比如内置的 dict 类型的方法的一个子集 -- 甚至是相当小的子集 -- 的自定义对象,就足够“类-dictionary”而可以满足当前的要求。不过,能显式地整理出一个对象要用到的函数、模块、类或者框架中需要能够做哪些事情,将是很吸引人的。那就是 PyProtocols 包所做到的(一部分)。
在具有静态类型声明的编程语言中,为了在新的上下文中使用数据,您通常需要将其自一个类型 强制类型转换(cast)或者 转换(convert)到另一个类型。在其他语言中,转换根据上下文的需要隐式地进行,这些被称为 强迫同型(coercions)。Python 中既有强制类型转换也有强迫同型,通常使用更多的是前者(“显式优于隐式”)。您可以将向一个浮点数加到一个整型数,结果得到一个更为通用的浮点数;但是如果您希望将字符串 "3.14" 转换为一个数字,那么您需要使用显式的构造函数 float("3.14") 。
新闻热点
疑难解答