Dav*_*ave 5 python terminology
有人可以解释一下Python 编程中协议和接口这两个术语的区别吗?
我在缓冲协议和PEP 544等内容中看到对术语“协议”的引用,但想确保我理解这个术语的含义,以及何时何地,您会以不同于一般概念的方式使用它一个“接口”。
在我尝试回答这个问题之前,先回顾一下接口的定义:
接口包含非抽象类或结构必须实现的一组相关功能的定义。
来源:微软文档
接口在静态类型语言中用于描述两个独立的对象“实现相同的行为”。接口在代码中正式声明并由编译器强制执行(因此必须在上面的接口定义中)。它们是告诉类型系统两个对象理论上可以相互替换(因此在某种程度上相关)的一种方式。另一种方式是继承。如果不能,编译器会抛出错误。
与此相反,像 Python 这样的动态类型语言不需要接口或继承等机制来检查两个对象是否相关。他们使用鸭子类型,在运行时推导对对象的适当函数/方法的搜索。如果找到,则执行 - 如果没有,则抛出错误。因此,不需要接口。相反,有所谓的“特殊方法”,可以通过类实现来为实例提供某些“功能”,例如,可以通过实现 和__eq__方法来对它们进行哈希处理__hash__。这些非正式接口不是由编译器强制执行的,仅存在于文档中。
为了给出这些非正式接口的示例,想象一下偶然发现一段代码,该代码实现了一个行为类似于列表的自定义类。尽管代码中没有任何地方该类与任何抽象序列类相关,但您知道它用于生成类似序列的对象,因为它实现了 和__len__特殊__getitem__方法。
我认为协议是不太严格的接口版本,因为它们不是强制执行的,并且并非所有协议都必须由类实现。如果您只想让类可迭代,您可以选择并实现必须实现的特殊方法,而其余部分保持不变。
话虽如此,您可以使用抽象基类 (ABC) 来模拟类似接口的行为。