Python 3.7.4:继承ABC和具体类

问题描述

我正在模拟一个游戏,其中的每一步都是投掷炸弹。有1种常规炸弹和3种特殊炸弹。因此,我想创建一个类SpecialBomb作为这3个特殊炸弹类的抽象基础。这个想法是为了让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时我会缺少什么东西吗,还是每次类都继承自ABC和具体类都发生这种情况?

解决方法

ABCMeta实际上不会阻止您实例化一个类,除非它具有抽象方法。您可以使用抽象方法装饰器将__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()

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...