Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python术语:接口与协议_Python_Terminology - Fatal编程技术网

Python术语:接口与协议

Python术语:接口与协议,python,terminology,Python,Terminology,有人能解释一下Python编程环境中术语“协议”和“接口”之间的区别吗 我在和中看到了对术语“协议”的引用,但我想确保我理解这个术语的含义,以及在何时何地使用它与“接口”的一般概念不同。在我尝试回答这个问题之前,回想一下接口的定义: 接口包含非抽象类或结构必须实现的一组相关功能的定义 资料来源: 静态类型语言中使用接口来描述两个独立对象“实现相同的行为”。接口在代码中正式声明,并由编译器强制执行(因此必须在上面的接口定义中使用)。它们是告诉类型系统两个对象理论上可以相互替换(因此在某种程度上是相

有人能解释一下Python编程环境中术语“协议”和“接口”之间的区别吗


我在和中看到了对术语“协议”的引用,但我想确保我理解这个术语的含义,以及在何时何地使用它与“接口”的一般概念不同。

在我尝试回答这个问题之前,回想一下接口的定义:

接口包含非抽象类或结构必须实现的一组相关功能的定义

资料来源:

静态类型语言中使用接口来描述两个独立对象“实现相同的行为”。接口在代码中正式声明,并由编译器强制执行(因此必须在上面的接口定义中使用)。它们是告诉类型系统两个对象理论上可以相互替换(因此在某种程度上是相关的)的一种方式。另一种方式是继承。如果不能,编译器将抛出一个错误

与此相反,像Python这样的动态类型语言不需要像接口或继承这样的机制来检查两个对象是否相关。它们使用duck类型,其中在运行时推断出对对象的适当函数/方法的搜索。如果找到,则执行它-如果没有,则抛出错误。因此,不需要接口。相反,有一些所谓的“特殊方法”,可以由类来实现,以给实例提供某些“特性”,例如,可以通过实现
\uuuuuu eq\uuu
\uuuuuu hash\uu
方法对它们进行散列。这些非正式接口不是由编译器强制执行的,只存在于文档中

要为这些非正式接口提供一个示例,只需想象一下在实现一个行为类似于列表的自定义类的某段代码中遇到障碍。即使在代码中,这个类与任何抽象序列类都不相关,但您知道它用于生成类似序列的对象,因为它实现了
\uuu len\uuu
\uu getitem\uuu
特殊方法

我将协议视为接口的不那么严格的版本,因为它们不强制执行,并且并非所有协议都必须由类实现。如果您只是希望类是可移植的,那么您可以选择并实现必须实现的特殊方法,并保持其余方法不变


这就是说,您可以通过使用抽象基类(ABC)来模拟类似接口的行为。

@jornsharpe请注意,该页面在使用协议和接口方面是如何摇摆不定的,并且在某些地方可以互换使用它们。它们是Python上下文中的同义词,还是协议有一些额外的(隐含的)含义特性等?我建议阅读Luciano Ramalho所著的流畅Python书籍《Python文化中的接口和协议》,以全面了解Python中协议和接口之间的差异。@FrancoMorero我接受一个答案,您在这里提供了一些(最低限度的)差异概述,然后说细节在那本书中。这里有另一个有用的链接:。简言之,我认为协议是一种“非正式接口”,它定义了类的交互方式,但不是语言语法的一部分。更“正式的接口”可以通过定义要实现的接口方法的抽象基类来实现。更多详情请参见该页。