You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中@abstractmethod的作用是什么?无该装饰器时代码仍可运行

问题1:@abstractmethod的核心作用

你现在的代码能正常运行,是因为两个子类test_class、example_class都完整实现了被@abstractmethod装饰的task方法,所以有没有装饰器看起来没有区别。它的核心作用是强制约束继承了抽象基类(ABC)的非抽象子类,必须实现所有被@abstractmethod标记的方法:

  • 如果你加了@abstractmethod,写一个没有实现task方法的子类,实例化这个子类的时候会直接抛出TypeError,禁止实例化,从语法层面保证所有子类都遵循统一的接口规范
  • 如果你删掉了@abstractmethod,也不导入abc模块,那么Absclass就只是普通的父类,哪怕子类不实现task方法,实例化也能正常运行,无法达到抽象类强制接口统一的设计目的

你可以用这段代码验证效果:

# 保留abc导入和@abstractmethod的前提下
class bad_class(Absclass):
    # 不实现task方法
    pass

bad_obj = bad_class() # 直接报错:TypeError: Can't instantiate abstract class bad_class with abstract method task

这个报错就是@abstractmethod存在的意义:保证所有继承该抽象类的子类,都必须提供指定方法的实现,避免上层调用的时候出现找不到方法的问题。

问题2:调用抽象类Absclass的task方法

你只需要在子类的task方法中,通过super()调用父类的同名方法即可,示例修改如下:

class test_class(Absclass):
    def task(self):
        super().task() # 调用父类Absclass的task方法,就会执行对应的print语句
        print("We are inside test_class task")

此时调用test_obj.task()的输出会是:

We are inside Absclass task
We are inside test_class task

你也可以选择显式指定父类调用:Absclass.task(self),效果和super()调用完全一致。

内容的提问来源于stack exchange,提问作者EBG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:27:03