这类不能被继承?这类不能被继承?(Which classes cannot be subclasse

2019-05-13 11:36发布

是否有任何规则有关其内置和标准库类不是子类化(“最终”)?

对于Python 3.3的,这里有几个例子:

  • bool
  • function
  • operator.itemgetter
  • slice

我发现了一个问题,这与“最终”类的实现的交易,无论是在C和纯Python。

我想了解什么原因可以解释为什么一个类被选定为在第一时间“最终”。

Answer 1:

似乎有两个原因一类是在Python“最后”。

1.类不变违反

遵循Singleton模式的类有一个不变的是有实例的限制(预先确定的)数量。 任何违反此不变量在子类中的将是与阶级的意图不一致,将无法正常工作。 例子:

  • boolTrueFalse ; 见圭多的评论
  • NoneTypeNone
  • NotImplementedTypeNotImplemented
  • ellipsisEllipsis

有可能比该类别中的Singleton模式其他情况下,但我不知道有任何。

2.无说服力的用例

用C语言实现的一类需要额外的工作,以允许子类(至少在CPython的)。 做这样的工作没有一个令人信服的用例是不是非常有吸引力,所以志愿者们不太可能出面。 例子:

  • function ; 看到蒂姆·彼得斯后

注1:

我原本以为有有效的用例,但利率完全不够,在子类functionoperator.itemgetter 。 由于@agf用于指出所提供的使用情况在这里和这里都不能令人信服(见@agf意见的问题)。

笔记2:

我担心的是另一个Python实现可能会意外地允许继承一个类,在CPython的是决赛。 这可能会导致不可移植的代码(用例可能是微弱的,但有人可能仍然写的子类代码function ,如果他们的Python的支持的话)。 这可以通过Python文档中标记的所有内置和不能被继承标准类库,并要求所有的实现方案都遵循在这方面CPython的行为来解决。

注3:

通过CPython的在所有上述情况下,所产生的消息为:

TypeError: type 'bool' is not an acceptable base type

这是很神秘的,因为在这个问题上展示了许多问题。 我会提交建议增加一个段落,说明最后类的文档,甚至可能更改错误消息:

TypeError: type 'bool' is final (non-extensible)


文章来源: Which classes cannot be subclassed?