Python中继承ABC的类是否为抽象类?为何可直接实例化无报错?
现象原因
仅继承ABC类不足以让Python将其判定为不可实例化的抽象类,你的Example类中没有任何被@abstractmethod装饰的未实现抽象方法,因此可以正常实例化,不会触发报错。
Python抽象类判定规则
Python的抽象类判定需要同时满足两个条件:
- 类的元类为
ABCMeta(通常通过继承ABC类实现,ABC类的元类默认就是ABCMeta) - 类本身或其继承的父类中,存在至少一个未被实现的、被
@abstractmethod装饰的抽象方法/属性
只有同时满足以上两个条件的类,才会被标记为不可实例化的抽象类,尝试实例化时会抛出TypeError。
如果子类继承了抽象父类,必须重写实现所有被@abstractmethod标记的抽象方法,才会成为可实例化的普通类;如果没有实现完全部抽象方法,子类依旧是不可实例化的抽象类。
验证示例
给你的Example类添加抽象方法后,就会触发实例化报错:
from abc import ABC, abstractmethod class Example(ABC): def smile(self): print("smile") # 添加被@abstractmethod装饰的抽象方法 @abstractmethod def cry(self): pass # 执行以下代码会抛出 TypeError: Can't instantiate abstract class Example with abstract method cry example = Example()
内容的提问来源于stack exchange,提问作者Kun.tito
相关产品推荐
相关产品推荐

