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

Python中非抽象类中的abstractmethod是否为普通实例方法?

非抽象类中的@abstractmethod装饰方法是否属于普通实例方法?

先看测试代码及输出:

from abc import ABC, abstractmethod

class Animal: # 未继承ABC
    @abstractmethod
    def sound(self):
        print("Wow!!")

class Cat(Animal):
    pass

obj1 = Animal()
obj1.sound()

obj2 = Cat()
obj2.sound()

输出:

Wow!!
Wow!!

核心结论

在未继承ABC的非抽象类中,用@abstractmethod装饰的方法完全等同于普通实例方法,装饰器的抽象方法限制逻辑不会生效。

原因分析

@abstractmethod的核心约束能力依赖于ABC抽象基类的机制:

  • 当类继承自ABC时,被@abstractmethod装饰的方法会标记类为抽象类,阻止类本身实例化,同时强制子类必须重写所有抽象方法才能完成实例化。
  • 如果类没有继承ABC,@abstractmethod仅会给方法添加一个__isabstractmethod__属性,但Python不会基于这个属性做任何限制——你可以正常实例化该类,调用方法时会执行方法体内的代码,子类也无需强制重写该方法。

回到测试代码:

  • Animal类未继承ABC,因此即使sound被@abstractmethod装饰,依然可以实例化Animal对象,调用sound时会直接执行方法内的print语句。
  • Cat类继承Animal后未重写sound,调用时会直接继承父类的方法实现,因此输出相同内容。

内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:05:22