• 在超大型的软件项目里,特别是那些期望与很多其他软件互动的,开发精确良好的应用程序接口(APIs)是非常必要的。我们可将APIs想象成一种框架,就像是RFC或POSIX标准那样。一旦定义了接口并且发布了,它就很难再被改变。但是,API在单体软件里也有用途,被看作是内部API。 当其他编程语言,例如Java,就将接口作为语言内部的特性,而直到最近Python才有了同等意义的正式的接口。通常,在Python里接口是通过类(class)来定义并实现的,并且它是通过文档来创建的API的表现。有很多关于这方面的文章。开发人员经常在没有意识到破坏了其他人的代码的情况下修改了类的API。编程接口可以完全解决这个问题,当一个API被破坏时警铃就会响起(通过测试)。 下面是一个简单的Python接口的例子(已经被使用在Zope项目中)

    行 1:我们从zope.interface导入了2个重要的对象——元类Interface,类Attribute。 行 3:我们“误用”定义类的方式来定义接口。注意,虽然接口不是类并且也没有类的行为,但是当你把接口作为类的基类时,这个对象就变成了接口。 行 4:在Zope3里,这是接口的文档。所以,在这里写上明确的文档字符串是很必要的。接口文档字符串给出了实现接口功能的详细描述。 行 6:Attribute类是用来在接口中声明属性的。这个类的构造方法仅接受一个字符串参数,就是这个属性的文档字符串。现在你可能会说:“还有很多的元数据属性存在,例如整型的最小值或者字符串的最大长度等。”这一类型的扩展属性类是由另外一个模块提供的,叫zope.schema。我们将在“Zope模型和窗口部件(表单)”章节中阐述。 行 8-9和11-12:像通常那样使用def关键字来定义方法。不同的是第一个参数不是self。你只是列出了所有的公共参数。文档字符串依然作为文档来使用的。 除此之外,方法中可以包含任何你想要的东西,Zope不会使用方法里的任何内容。如果你在Zope3之外使用zope.interface包,那么你可以方法体来为先决条件、参数类型和返回类型提供一个正式的描述。 上面是一个典型的但不实际的接口例子。既然我们使用Python,就没有必要同时为属性实现setter和getter方法。在这种情况下,我们通常可以将属性制定为接口的一部分并且用Python的属性来实现它,如果需要的话。