哪些类不能被子类化?

max*_*max 71 python inheritance language-design class python-3.x

是否有关于哪些内置和标准库类不可子类化("最终")的规则?

从Python 3.3开始,这里有几个例子:

  • bool
  • function
  • operator.itemgetter
  • slice

我发现了一个问题,它涉及C语言和纯Python中"final"类的实现.

我想了解是什么原因可以解释为什么一个班级被选为首选的"最终".

max*_*max 26

在Python中,类似乎有两个"最终"的原因.

1.违反类不变量

遵循Singleton模式的类具有不变量,即具有有限(预定)数量的实例.在子类中违反此不变量将与类的意图不一致,并且无法正常工作.例子:

  • bool:True,False; 看看圭多的评论
  • NoneType: None
  • NotImplementedType: NotImplemented
  • ellipsis: Ellipsis

在此类别中可能存在除Singleton模式之外的情况,但我不知道任何情况.

2.没有说服力的用例

用C实现的类需要额外的工作来允许子类化(至少在CPython中).在没有令人信服的用例的情况下进行此类工作并不是很有吸引力,因此志愿者不太可能挺身而出.例子:

注1:

我原本以为有有用的用例,但只是没有足够的兴趣,在子类化functionoperator.itemgetter.感谢@agf指出此处此处提供的用例并不令人信服(请参阅@agf评论问题).

笔记2:

我担心的是另一个Python实现可能会意外地允许子类化CPython中的最终类.这可能导致不可移植的代码(用例可能很弱,但是function如果Python支持它,有些人仍然可能编写子类的代码).这可以通过在Python文档中标记所有无法子类化的内置和标准库类来解决,并要求所有实现都遵循这方面的CPython行为.

注3:

CPython在上述所有情况下产生的消息是:

TypeError: type 'bool' is not an acceptable base type
Run Code Online (Sandbox Code Playgroud)

这是非常神秘的,因为关于这个主题的许多问题都表明了.我将提交一个建议,在解释最终类的文档中添加一个段落,甚至可能将错误消息更改为:

TypeError: type 'bool' is final (non-extensible)
Run Code Online (Sandbox Code Playgroud)

  • @Endophage:Qbit肯定是一个有用的类型,但它不是`bool`的一个sublcass,事实上,恰恰相反,每一个布尔值都是一种qbit!一个恰好被观察到的.不过,我可能会用`__subclasscheck__`和朋友处理这种情况. (8认同)
  • @TokenMacGuy出色观察!那么为什么我们在Python中没有一个Qbit类,bool是它的子类!我要求它应该是这样!:-P (4认同)
  • 什么是"切片"? (4认同)
  • 当然,如果你正在编写薛定谔猫的模拟,你可能想要将"bool"子类化为包含"未知":-P只是开玩笑 (3认同)
  • @SingleNegationElimination @Endophage 也许这就是为什么 `bool` 不能成为 `Enum` 基类的原因,Guido 不玩骰子 (2认同)