Python 3.7.4:继承ABC和混凝土类
我正在模拟一个游戏,每一步都是投掷炸弹。有1种常规炸弹和3种特殊炸弹。因此,我想创建一个类Python 3.7.4:继承ABC和混凝土类,python,multiple-inheritance,abc,Python,Multiple Inheritance,Abc,我正在模拟一个游戏,每一步都是投掷炸弹。有1种常规炸弹和3种特殊炸弹。因此,我想创建一个类SpecialBomb,作为这3个特殊炸弹类的抽象基础。其思想是让SpecialBomb继承自Bomb,但仍然无法实例化SpecialBomb对象。我尝试了以下方法: class炸弹: 定义初始化(自): self.boom=True 班级特殊炸弹(炸弹,ABC): 定义初始化(自): super()。\uuuu init\uuuuu() 类交叉组(特殊组): 定义初始化(自): super()。\uuuu
SpecialBomb
,作为这3个特殊炸弹类的抽象基础。其思想是让SpecialBomb
继承自Bomb
,但仍然无法实例化SpecialBomb
对象。我尝试了以下方法:
class炸弹:
定义初始化(自):
self.boom=True
班级特殊炸弹(炸弹,ABC):
定义初始化(自):
super()。\uuuu init\uuuuu()
类交叉组(特殊组):
定义初始化(自):
super()。\uuuu init\uuuuu()
c=交叉组()
打印(c.boom)
s=特殊组()
boom
属性在c
中被正确继承,但是程序没有因为我实例化了SpecialBomb
而产生错误。当我继承ABC
时,我是否遗漏了一些东西,或者每次一个类同时从ABC
和一个具体的类继承时都会发生这种情况?ABCMeta实际上不会阻止您实例化一个类,除非它有一个抽象方法。您可以使用abstractmethod装饰器在SpecialBomb中包装\uuuu init\uuuu
,以创建所需的行为
from abc import abstractmethod, ABCMeta
class Bomb:
def __init__(self):
self.boom = True
class SpecialBomb(Bomb, metaclass=ABCMeta):
@abstractmethod
def __init__(self):
super().__init__()
class CrossBomb(SpecialBomb):
def __init__(self):
super().__init__()
c = CrossBomb()
print(c.boom)
s = SpecialBomb()
ABC尚未定义。这是什么?@aerijman OP指的是
ABC
模块中的ABC
。实例属性不是您所想的继承。另外,ABC
本身是完全可实例化的,前提是您没有定义任何抽象方法,而您没有定义任何抽象方法。CrossBomb
与SpecialBomb
一样是一个ABC