当前位置: 首页 > 面试题库 >

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

红富
2023-03-14
问题内容

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

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

  • bool
  • function
  • operator.itemgetter
  • slice

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

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


问题答案:

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

1.违反类别不变式

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

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

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

2.没有说服力的用例

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

  • function; 见蒂姆·彼得斯的帖子

注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)


 类似资料:
  • 我试图在html表中输出类别和子类别,我有一个问题,即所有的子类别都打印在所有的类别下 我用这个公式 cat_id 猫名 母猫 我想打印父主类别下的每个子类别 我使用这个代码 还有显示器。第三方物流是 有什么想法吗,伙计们 问候

  • 我目前有一个代码片段,其中对于每个类别,它将找到子类别: 将递归获取一个类别的子级: 目前,使用,只检索子类别的子类别,因此如果每个子类别都有自己的子类别,则不会将其保存到子类别中。 我如何显示子子类别给我们的子类别? 我想用我的代码做的是获取一个父级,获取它的子级,然后将这些子级中的每一个视为父级,递归地获取它的子级,但是我的JSON输出并没有反映这一点。只有父对象有子对象-子对象没有子对象(尽

  • 我已经为产品创建了一些自定义类别,它有子类别,子类别还有更多的子类别。现在我首先显示主要类别。如果我在那里显示子类别,那么将显示与该类别及其子类别相关的所有子类别。我想一步一步地向他们展示。也就是说,如果用户单击主类别,则会转到其子类别页面。如果用户单击其子类别之一,则应转到子类别,如果没有子类别,则显示产品。这是什么代码 它覆盖了以前的排序顺序。也就是说,如果从仪表板中,我们按排序顺序给出2到3

  • 有一个类别,具有以下(重要)属性: 我正在尝试实现类别/子类别的概念。一个类别可以有零个或多个子类别。一个类别只能有一个父类别(可以为null)。对于顶级类别,parentCategory=null。 现在,我有一个所有类别的列表,

  • 本文向大家介绍普通类和抽象类有哪些区别?相关面试题,主要包含被问及普通类和抽象类有哪些区别?时的应答技巧和注意事项,需要的朋友参考一下 普通类不能包含抽象方法,抽象类可以包含抽象方法。 抽象类是不能被实例化的,就是不能用new调出构造方法创建对象,普通类可以直接实例化。 如果一个类继承于抽象类,则该子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。

  • 我发现了一个WooCommerce代码片段,它在分类页面上添加了排序功能,并且可以正常工作。 但问题是排序子类别仅显示在父类别页面上,而不显示在子类别页面中。 为了实现这一点,我需要在代码中修改什么? 这是我的密码: 参考:在单独的列表中显示商业类别、子类别和产品