Python 3.7.4:同时继承ABC和concrete class

Python 3.7.4: inheriting both ABC and concrete class

我正在为一个游戏建模,其中的每一步都是投掷炸弹。有1种普通炸弹和3种特殊炸弹。因此,我想创建一个 class SpecialBomb 作为这 3 个特殊炸弹 class 的抽象基础。这个想法是 SpecialBomb 继承自 Bomb,但仍然无法实例化 SpecialBomb 对象。我尝试了以下方法:

class Bomb:
    def __init__(self):
        self.boom = True

class SpecialBomb(Bomb, ABC):
    def __init__(self):
        super().__init__()

class CrossBomb(SpecialBomb):
    def __init__(self):
        super().__init__()

c = CrossBomb()
print(c.boom)
s = SpecialBomb()

boom 属性在 c 中被正确继承,但是程序 没有因为我实例化 SpecialBomb 而引发错误。当我继承 ABC 时,我是否缺少某些东西,或者每次 class 从 ABC 和具体的 class 继承时都会发生这种情况?

ABCMeta 实际上不会阻止您实例化 class 除非它有一个抽象方法。您可以使用抽象方法装饰器将 __init__ 包装在 SpecialBomb 中,以创建您想要的行为。

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()