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

