哪些类不能被分类?
是否有任何内置和标准库类不可分类(“最终”)的规则?
从Python 3.3开始,下面是一些例子:
bool
-
function
-
operator.itemgetter
-
slice
我发现了一个问题 ,用C和纯Python来处理“final”类的实现。
我想了解为什么一个class级被选为“最终”的原因可能是什么原因。
在Python中,类似于“最终”似乎有两个原因。
1.违反类不变
遵循Singleton模式的类有一个不变的情况,即有一个有限的(预先确定的)数量的实例。 在子类中任何违反这个不变的情况都将与类的意图不一致,并且不能正常工作。 例子:
-
bool
:对,False
; 看Guido的评论 -
NoneType
:None
-
NotImplementedType
:NotImplemented
-
ellipsis
:Ellipsis
在这个类别中,可能会出现除Singleton模式之外的其他情况,但是我不知道有这种情况。
2.没有说服力的用例
用C实现的类需要额外的工作来允许子类化(至less在CPython中)。 没有令人信服的用例做这样的工作并不是很有吸引力,所以志愿者不太可能出面。 例子:
-
function
看Tim Peters的post
注1:
我原本以为在function
子类化和operator.itemgetter
存在有效的用例,但是没有足够的兴趣。 感谢@agf指出这里和这里提供的用例并不令人信服(请参阅@agf对问题的评论)。
笔记2:
我担心的是另一个Python实现可能会意外地允许在CPython中创build最终类的子类。 这可能会导致不可移植的代码(一个用例可能很弱,但是如果他们的Python支持的话,有些人可能仍然编写代码来实现子类的function
)。 这可以通过在Python文档中标记所有不能被子类化的内置和标准库类来解决,并且要求所有实现遵循CPython在这方面的行为。
注3:
CPython在上述所有情况下生成的消息是:
TypeError: type 'bool' is not an acceptable base type
这个问题很多问题都显示出来,这是相当神秘的。 我将提交一个build议,在解释最终类的文档中添加一个段落,甚至可以将错误消息更改为:
TypeError: type 'bool' is final (non-extensible)