我想创建一个类层次结构,其中我有一个类 Block
,它可以自己实例化。然后我有一个 List
类,它继承自 Block
并包含所有列表共有的方法,最后我有类 OrderedList
、LableledList
等继承自 List
。我希望人们能够实例化 OrderedList
等,但不能实例化 List
。
换句话说,您可以实例化一个普通的Block
,也可以实例化一个OrderedList
,它继承自List
,而List
继承自 block
,但不能实例化List
。
谷歌的所有尝试都会导致抽象基类,但没有提供适合这种情况的示例,我无法推断。
最佳答案
下面与口译员的对话应该表明这是如何可能的。使用Block
继承抽象基类后,只需将List
上的初始化器标记为abstractmethod
即可。这将防止类的实例化而不会对子类造成问题。
>>> import abc
>>> class Block(abc.ABC):
def __init__(self, data):
self.data = data
>>> class List(Block):
@abc.abstractmethod
def __init__(self, data, extra):
super().__init__(data)
self.extra = extra
>>> class OrderedList(List):
def __init__(self, data, extra, final):
super().__init__(data, extra)
self.final = final
>>> instance = Block(None)
>>> instance = List(None, None)
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
instance = List(None, None)
TypeError: Can't instantiate abstract class List with abstract methods __init__
>>> instance = OrderedList(None, None, None)
>>>
关于python - 不应实例化的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42837521/