在像 python 这样的 OOP 语言上,从接口到类型和抽象 class 的实际区别是什么?

Whats is the practical difference from a Interface to a type and to an abstract class on OOP languages like python?

在 python 等 OOP 语言中,从接口到类型和抽象 class 的实际区别是什么?

指向维基百科的链接看起来一样 Interface, type and abstract class

Python 有 duck typing :

If it walks like a duck and it quacks like a duck, then it must be a duck

这意味着这行得通:

class Duck:
    def quack(self):
        print("quack!")


class Car:
    def quack(self):
        print("vroum!")  # for example purposes


def make_it_quack(something):
    something.quack()  # don't care what it is, just that it quacks


make_it_quack(Duck())  # quack!
make_it_quack(Car())  # vroum!

Python 在运行时会尝试调用对象的 quack 方法,如果不存在则失败。但是只要方法存在(并且签名合适),Python 就不会关心对象的实际类型。

在其他语言中,您可能需要定义两个子 class 都必须继承的基础 class(可能 抽象 )。如果您希望您的对象具有多组不同的方法,您 1) 可以进行多重继承,2) 您可以构建(抽象)基础 classes 或 3) 的高层次结构,您会创建很多接口。 Python 不需要任何这些,但它不会为您提供代码类型检查的静态保证。

如果需要,Python 中有一些方法可以进行更多类型检查:

  • 您可以使用标准库 abc
  • 声明抽象基 classes
  • 您可以在代码中添加类型注释并使用外部类型检查器(例如 MyPy)。

TL;DR : Python 是鸭子类型的,但如果您想要接口契约附带的保证,可以使用工具。

看书design patterns GoF他们解释说接口是shell方法公开可用,类型是数据的内部结构,抽象class可以是这样的形式当脚本构建一个看起来像类型的对象时,将基于数据。