哪些类别不能被子类别化?

发布于 2021-01-29 19:36:38

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

从Python 3.3开始,以下是一些示例:

  • bool
  • function
  • operator.itemgetter
  • slice

我发现了一个问题,涉及用C语言和纯Python实现“最终”类。

我想了解什么原因可以解释为什么首先选择一个班级是“最终的”。

关注者
0
被浏览
103
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    在Python中,类最终是有两个原因的。

    1.违反类别不变式

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

    • boolTrueFalse; 参见Guido的评论
    • NoneTypeNone
    • NotImplementedTypeNotImplemented
    • ellipsisEllipsis

    在此类别中,可能还有Singleton模式以外的情况,但我不知道有任何情况。

    2.没有说服力的用例

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

    注1:

    我原本以为有合理的用例,但是对function和的子类化却没有足够的兴趣operator.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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看