Python中的抽象类和接口有什么不同?

推荐答案

您有时会看到以下内容:

class Abstract1:
    """Some description that tells you it's abstract,
    often listing the methods you're expected to supply."""

    def aMethod(self):
        raise NotImplementedError("Should have implemented this")

因为Python没有(也不需要)正式的接口契约,所以抽象和接口之间不存在Java风格的区别.如果有人努力定义一个正式的接口,它也将是一个抽象类.唯一的区别在于文档字符串中声明的意图.

抽象和界面之间的区别是一个令人毛骨悚然的事情,当你有鸭子打字.

Java使用接口是因为它没有多重继承.

由于Python具有多重继承,因此您可能还会看到如下所示

class SomeAbstraction:
    pass  # lots of stuff - but missing something

class Mixin1:
    def something(self):
        pass  # one implementation

class Mixin2:
    def something(self):
        pass  # another

class Concrete1(SomeAbstraction, Mixin1):
    pass

class Concrete2(SomeAbstraction, Mixin2):
    pass

它使用一种带有mixin的抽象超类来创建不相交的具体子类.

Python相关问答推荐

Python类型注释:注释返回库对象的函数的正确方法

按字母顺序排序Pandas 数据框中列的子集

如果数组包含输入,则消除数组内的列表

如何计算Pandas 数据框中单元格内的行数,这些行数不是空行

如何使用 Lambda 赋予 HTTP API 或 REST API 不更新的能力?

通过python在字典内的字典中打印数字

在python中声明文件夹路径的正确方法是什么?

组合数组的相似元素

将值与列索引 pandas 匹配

将到今年年底的剩余时间添加到今天的日期

如何将整数和字符串合并为一个字符串?

AttributeError:try 在 discord.py 中创建按钮时,模块“discord”没有属性“ui”

BS4,在未封闭

Python ImportError: sys.meta_path is None, Python 可能正在关闭

Visual Studio Code 在“窗口没有响应”之后冻结

无法使用可从 cli 运行的命令调用子进程

数据集中值的 Python 总和

带有Pandas 的ValueError应用函数返回可变形状的输出

根据 Pandas Groupby 中的组合标准添加新列

正则表达式.获取两个括号之间的字符串(python)