Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.7.4:继承ABC和混凝土类_Python_Multiple Inheritance_Abc - Fatal编程技术网

Python 3.7.4:继承ABC和混凝土类

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

我正在模拟一个游戏,每一步都是投掷炸弹。有1种常规炸弹和3种特殊炸弹。因此,我想创建一个类
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