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
相关产品推荐
相关产品推荐

