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相关问答推荐

为什么这个带有List输入的简单numba函数这么慢

Polars:用氨纶的其他部分替换氨纶的部分

Django admin Csrf令牌未设置

如何在Python中使用另一个数据框更改列值(列表)

网格基于1.Y轴与2.x轴显示在matplotlib中

Maya Python脚本将纹理应用于所有对象,而不是选定对象

Python避免mypy在相互引用中从另一个类重定义类时失败

使用Openpyxl从Excel中的折线图更改图表样式

从旋转的DF查询非NaN值

Gekko中基于时间的间隔约束

无法在Spyder上的Pandas中将本地CSV转换为数据帧

如何在Airflow执行日期中保留日期并将时间转换为00:00

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

为什么在不先将包作为模块导入的情况下相对导入不起作用

解析CSV文件以将详细信息添加到XML文件

Groupby并在组内比较单独行上的两个时间戳

对当前的鼹鼠进行编码,并且我的按键获得了注册

Wagail:当通过外键访问索引页时,如何过滤索引页的子项

在FastAPI/Starlette中使用WebSockets时如何运行后台任务?

torch 二维张量与三维张量欧氏距离的计算