【发布时间】:2019-12-13 04:47:53
【问题描述】:
所以,这里有一个问题:
我想定义一个抽象类,比如说
AbstractA,它不需要子类来实现它的任何方法,而是扩展它的功能。就 Java 而言,这将是接口类。-
此外,我希望能够创建一个抽象子类,比如说
AbstractB,它具有相同的属性,但某些方法重新定义或扩展了基类方法。
我不想让类 (AbstractA) 抽象,例如through the check of class name in __init__ or __new__,因为这需要抽象子类 (AbstractB) 重新定义该方法及其主要功能,即新实例的构造或初始化。或者打电话给super().__init__(...),我也希望避免这样做(也许我在这里错了)。
所以,我想要这样的东西:
class AbstractA:
def __init__(self):
# do initialization stuff
def very_common_method(self, ...):
# do very common stuff
class AbstractB(AbstractA):
# do not duplicate initialization stuff here, inherit instead
def less_common_method(self, ...):
# do less common stuff
class AX(AbstractA):
def specific_method_1(self, ...):
class BX(AbstractB):
def specific_method_2(self, ...):
# Instantiating AbstractA or AbstractB should result in error.
# Instantiating AX or BX should not.
下面我有一个可能的解决方案。 有什么我忽略的缺点吗?更好的解决方案?
谢谢!
【问题讨论】:
-
class AX(AbstractA): pass应该合法吗?禁止AbstractA直接实例化但允许AX实例化有什么意义? -
@chepner,公平的问题。我必须接受这个要求更多的是一种偏好而不是必要性。我想要抽象类的原因是因为在语义上实例化这个父类没有意义。就像在实现虚拟动物时,实例化动物或哺乳动物是没有意义的。相反,应该实例化更详细的物种。因此,我想让滥用仅用于定义公共属性的类变得更加困难。至于拳头部分,完全禁止mususe还不够难,但足以防止意外。有点像_private_identifiers。
标签: python inheritance abstract-class