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()
我正在为一个游戏建模,其中的每一步都是投掷炸弹。有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()